This is an automated email from the git hooks/post-receive script.

sebastic pushed a commit to branch master
in repository mkgmap.

commit 5fffaff029fbb8ccb6312dc14da0a96277a787ee
Author: Bas Couwenberg <sebas...@xs4all.nl>
Date:   Sat Aug 5 14:12:32 2017 +0200

    New upstream version 0.0.0+svn3978
---
 resources/installer/installer_template.nsi         |  2 +-
 resources/mkgmap-version.properties                |  4 +-
 src/uk/me/parabola/imgfmt/Utils.java               | 14 +++++-
 .../parabola/imgfmt/app/BufferedImgFileWriter.java | 49 ++++++++++++++++++++
 .../imgfmt/app/FileBackedImgFileWriter.java        | 53 ++++++++++++++++++++++
 src/uk/me/parabola/imgfmt/app/ImgFileWriter.java   | 22 +++++++++
 src/uk/me/parabola/imgfmt/app/SectionWriter.java   | 12 +++++
 src/uk/me/parabola/imgfmt/app/lbl/LBLFile.java     |  8 ++++
 .../me/parabola/imgfmt/app/lbl/LBLFileReader.java  | 22 ++-------
 src/uk/me/parabola/imgfmt/app/lbl/POIRecord.java   | 42 +++++------------
 src/uk/me/parabola/imgfmt/app/lbl/PlacesFile.java  |  8 ++++
 src/uk/me/parabola/imgfmt/app/mdr/Mdr15.java       |  2 +-
 src/uk/me/parabola/imgfmt/app/mdr/Mdr17.java       |  2 +-
 src/uk/me/parabola/imgfmt/app/mdr/Mdr18.java       |  2 +-
 src/uk/me/parabola/imgfmt/app/mdr/Mdr19.java       |  2 +-
 .../me/parabola/imgfmt/app/mdr/Mdr1MapIndex.java   | 17 +------
 src/uk/me/parabola/imgfmt/app/mdr/Mdr25.java       |  2 +-
 src/uk/me/parabola/imgfmt/app/mdr/Mdr26.java       |  2 +-
 src/uk/me/parabola/imgfmt/app/mdr/Mdr27.java       |  2 +-
 src/uk/me/parabola/imgfmt/app/mdr/Mdr28.java       |  6 +--
 src/uk/me/parabola/imgfmt/app/mdr/Mdr29.java       | 17 +++----
 src/uk/me/parabola/imgfmt/app/mdr/Mdr2x.java       |  4 +-
 src/uk/me/parabola/imgfmt/app/mdr/Mdr5.java        | 10 ++--
 src/uk/me/parabola/imgfmt/app/mdr/Mdr6.java        |  2 +-
 src/uk/me/parabola/imgfmt/app/mdr/Mdr7.java        |  2 +-
 src/uk/me/parabola/imgfmt/app/mdr/Mdr8.java        |  2 +-
 src/uk/me/parabola/imgfmt/app/mdr/Mdr9.java        |  2 +-
 .../me/parabola/imgfmt/app/mdr/MdrMapSection.java  |  9 ++--
 src/uk/me/parabola/imgfmt/app/mdr/MdrSection.java  | 44 +++---------------
 src/uk/me/parabola/imgfmt/app/mdr/PrefixIndex.java |  7 +--
 .../me/parabola/imgfmt/app/net/NETFileReader.java  | 17 ++-----
 .../me/parabola/imgfmt/app/net/NumberPreparer.java | 16 ++++---
 src/uk/me/parabola/imgfmt/app/net/RoadDef.java     | 32 ++++---------
 src/uk/me/parabola/imgfmt/app/typ/TYPFile.java     | 49 ++++----------------
 src/uk/me/parabola/mkgmap/build/MapBuilder.java    | 20 +++++++-
 .../mkgmap/filters/MustSplitException.java         | 17 ++++---
 .../osmstyle/housenumber/HousenumberGenerator.java |  5 +-
 src/uk/me/parabola/util/ShapeSplitter.java         | 28 +-----------
 test/func/lib/ArrayImgWriter.java                  | 22 +++++++++
 39 files changed, 315 insertions(+), 263 deletions(-)

diff --git a/resources/installer/installer_template.nsi 
b/resources/installer/installer_template.nsi
index 6de4b09..f64a1da 100644
--- a/resources/installer/installer_template.nsi
+++ b/resources/installer/installer_template.nsi
@@ -8,7 +8,7 @@ SetCompressor /SOLID lzma
 ; Installer pages
 !define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
 !insertmacro MUI_PAGE_WELCOME
-!insertmacro MUI_PAGE_LICENSE ${MAPNAME}_license.txt
+!insertmacro MUI_PAGE_LICENSE "${MAPNAME}_license.txt"
 !insertmacro MUI_PAGE_DIRECTORY
 !insertmacro MUI_PAGE_INSTFILES
 !insertmacro MUI_PAGE_FINISH
diff --git a/resources/mkgmap-version.properties 
b/resources/mkgmap-version.properties
index 4263a63..fd2cc69 100644
--- a/resources/mkgmap-version.properties
+++ b/resources/mkgmap-version.properties
@@ -1,2 +1,2 @@
-svn.version: 3973
-build.timestamp: 2017-06-27T10:13:56+0100
+svn.version: 3978
+build.timestamp: 2017-08-04T09:44:15+0100
diff --git a/src/uk/me/parabola/imgfmt/Utils.java 
b/src/uk/me/parabola/imgfmt/Utils.java
index 36c258a..b933803 100644
--- a/src/uk/me/parabola/imgfmt/Utils.java
+++ b/src/uk/me/parabola/imgfmt/Utils.java
@@ -425,5 +425,17 @@ public class Utils {
 
                return true;
        }
-}
 
+       public static int numberToPointerSize(int n) {
+       // moved from imgfmt/app/mdr/MdrSection.java and app/typ/TYPFile.java
+               if (n <= 0xff)
+                       return 1;
+               else if (n <= 0xffff)
+                       return 2;
+               else if (n <= 0xffffff)
+                       return 3;
+               else
+                       return 4;
+       }
+
+}
diff --git a/src/uk/me/parabola/imgfmt/app/BufferedImgFileWriter.java 
b/src/uk/me/parabola/imgfmt/app/BufferedImgFileWriter.java
index 3c0c642..577d85f 100644
--- a/src/uk/me/parabola/imgfmt/app/BufferedImgFileWriter.java
+++ b/src/uk/me/parabola/imgfmt/app/BufferedImgFileWriter.java
@@ -119,6 +119,28 @@ public class BufferedImgFileWriter implements 
ImgFileWriter {
        }
 
        /**
+        * Write out int in range 0..255 as single byte.
+        * Use instead of put() for unsigned for clarity.
+        * @param val The value to write.
+        */
+       public void put1(int val) {
+               assert val >= 0 && val <= 255 : val;
+               ensureSize(1);
+               buf.put((byte)val);
+       }
+
+       /**
+        * Write out int in range 0..65535 as two bytes in correct byte order.
+        * Use instead of putChar() for unsigned for clarity.
+        * @param val The value to write.
+        */
+       public void put2(int val) {
+               assert val >= 0 && val <= 65535 : val;
+               ensureSize(2);
+               buf.putShort((short)val);
+       }
+
+       /**
         * Write out a 3 byte value in the correct byte order etc.
         *
         * @param val The value to write.
@@ -140,6 +162,33 @@ public class BufferedImgFileWriter implements 
ImgFileWriter {
        }
 
        /**
+        * Write out 1-4 bytes.  Done in the correct byte order.
+        *
+        * @param nBytes The number of bytes to write.
+        * @param val The value to write.
+        */
+       public void putN(int nBytes, int val) {
+               ensureSize(nBytes);
+               switch (nBytes) {
+               case 1:
+                       buf.put((byte)val);
+                       break;
+               case 2:
+                       buf.putShort((short)val);
+                       break;
+               case 3:
+                       buf.put((byte)val);
+                       buf.putShort((short)(val >> 8));
+                       break;
+               case 4:
+                       buf.putInt(val);
+                       break;
+               default:
+                       assert false : nBytes;
+               }
+       }
+
+       /**
         * Write out an arbitrary length sequence of bytes.
         *
         * @param val The values to write.
diff --git a/src/uk/me/parabola/imgfmt/app/FileBackedImgFileWriter.java 
b/src/uk/me/parabola/imgfmt/app/FileBackedImgFileWriter.java
index 5a8d127..57d9fe0 100644
--- a/src/uk/me/parabola/imgfmt/app/FileBackedImgFileWriter.java
+++ b/src/uk/me/parabola/imgfmt/app/FileBackedImgFileWriter.java
@@ -130,6 +130,36 @@ public class FileBackedImgFileWriter implements 
ImgFileWriter{
        }
 
        /**
+        * Write out int in range 0..255 as single byte.
+        * Use instead of put() for unsigned for clarity.
+        * @param val The value to write.
+        */
+       public void put1(int val) {
+               assert val >= 0 && val <= 255 : val;
+               try {
+                       file.write(val);
+               } catch (IOException e) {
+                       throw new MapFailedException("could not write byte to 
mdr tmp file");
+               }
+       }
+
+       /**
+        * Write out int in range 0..65535 as two bytes in correct byte order.
+        * Use instead of putChar() for unsigned for clarity.
+        * @param val The value to write.
+        */
+       public void put2(int val) {
+               assert val >= 0 && val <= 65535 : val;
+               try {
+                       file.write(val);
+                       file.write(val >> 8);
+               } catch (IOException e) {
+                       throw new MapFailedException("could not write 2 bytes 
to mdr tmp file");
+               }
+
+       }
+
+       /**
         * Write out three bytes.  Done in the little endian byte order.
         *
         * @param val The value to write, only the bottom three bytes will be 
written.
@@ -145,6 +175,29 @@ public class FileBackedImgFileWriter implements 
ImgFileWriter{
        }
 
        /**
+        * Write out 1-4 bytes.  Done in the correct byte order.
+        *
+        * @param nBytes The number of bytes to write.
+        * @param val The value to write.
+        */
+       public void putN(int nBytes, int val) {
+               try {
+                       file.write(val);
+                       if (nBytes <= 1)
+                               return;
+                       file.write(val >> 8);
+                       if (nBytes <= 2)
+                               return;
+                       file.write(val >> 16);
+                       if (nBytes <= 3)
+                               return;
+                       file.write(val >> 24);
+               } catch (IOException e) {
+                       throw new MapFailedException("could not write put3 to 
mdr tmp file");
+               }
+       }
+
+       /**
         * Write out 4 byte value.
         *
         * @param val The value to write.
diff --git a/src/uk/me/parabola/imgfmt/app/ImgFileWriter.java 
b/src/uk/me/parabola/imgfmt/app/ImgFileWriter.java
index 9a094c3..ea1d1f2 100644
--- a/src/uk/me/parabola/imgfmt/app/ImgFileWriter.java
+++ b/src/uk/me/parabola/imgfmt/app/ImgFileWriter.java
@@ -64,6 +64,20 @@ public interface ImgFileWriter extends Closeable {
        public void putChar(char c);
 
        /**
+        * Write out int in range 0..255 as single byte.
+        * Use instead of put() for unsigned for clarity.
+        * @param val The value to write.
+        */
+       public void put1(int val);
+
+       /**
+        * Write out int in range 0..65535 as two bytes in correct byte order.
+        * Use instead of putChar() for unsigned for clarity.
+        * @param val The value to write.
+        */
+       public void put2(int val);
+
+       /**
         * Write out three bytes.  Done in the correct byte order.
         *
         * @param val The value to write, only the bottom three bytes will be
@@ -72,6 +86,14 @@ public interface ImgFileWriter extends Closeable {
        public void put3(int val);
        
        /**
+        * Write out 1-4 bytes.  Done in the correct byte order.
+        *
+        * @param nBytes The number of bytes to write.
+        * @param val The value to write.
+        */
+       public void putN(int nBytes, int val);
+
+       /**
         * Write out 4 byte value.
         * @param val The value to write.
         */
diff --git a/src/uk/me/parabola/imgfmt/app/SectionWriter.java 
b/src/uk/me/parabola/imgfmt/app/SectionWriter.java
index 126564a..c400d57 100644
--- a/src/uk/me/parabola/imgfmt/app/SectionWriter.java
+++ b/src/uk/me/parabola/imgfmt/app/SectionWriter.java
@@ -66,10 +66,22 @@ public class SectionWriter implements ImgFileWriter {
                writer.putChar(c);
        }
 
+       public void put1(int val) {
+               writer.put1(val);
+       };
+
+       public void put2(int val) {
+               writer.put2(val);
+       };
+
        public void put3(int val) {
                writer.put3(val);
        }
 
+       public void putN(int nBytes, int val) {
+               writer.putN(nBytes, val);
+       }
+
        public void putInt(int val) {
                writer.putInt(val);
        }
diff --git a/src/uk/me/parabola/imgfmt/app/lbl/LBLFile.java 
b/src/uk/me/parabola/imgfmt/app/lbl/LBLFile.java
index b4bc0c0..95ba202 100644
--- a/src/uk/me/parabola/imgfmt/app/lbl/LBLFile.java
+++ b/src/uk/me/parabola/imgfmt/app/lbl/LBLFile.java
@@ -226,6 +226,14 @@ public class LBLFile extends ImgFile {
                return places.numZips();
        }
 
+       public int numHighways() {
+               return places.numHighways();
+       }
+
+       public int numExitFacilities() {
+               return places.numExitFacilities();
+       }
+
        public int getCodePage() {
                return lblHeader.getCodePage();
        }
diff --git a/src/uk/me/parabola/imgfmt/app/lbl/LBLFileReader.java 
b/src/uk/me/parabola/imgfmt/app/lbl/LBLFileReader.java
index 27bdc37..8c9e17c 100644
--- a/src/uk/me/parabola/imgfmt/app/lbl/LBLFileReader.java
+++ b/src/uk/me/parabola/imgfmt/app/lbl/LBLFileReader.java
@@ -19,6 +19,7 @@ import java.util.List;
 import java.util.Map;
 
 import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+import uk.me.parabola.imgfmt.Utils;
 import uk.me.parabola.imgfmt.app.BufferedImgFileReader;
 import uk.me.parabola.imgfmt.app.ImgFile;
 import uk.me.parabola.imgfmt.app.ImgFileReader;
@@ -404,22 +405,12 @@ public class LBLFileReader extends ImgFile {
                        }
 
                        if (hasCity) {
-                               int cityIndex;
-
-                               if (placeHeader.getNumCities() > 0xFF)
-                                       cityIndex = reader.getChar();
-                               else
-                                       cityIndex = reader.get() & 0xff;
-
+                               int cityIndex = 
reader.getUint(Utils.numberToPointerSize(placeHeader.getNumCities()));
                                poi.setCity(cities.get(cityIndex-1));
                        }
 
                        if (hasZip) {
-                               int zipIndex;
-                               if (placeHeader.getNumZips() > 0xff)
-                                       zipIndex = reader.getChar();
-                               else
-                                       zipIndex = reader.get() & 0xff;
+                               int zipIndex = 
reader.getUint(Utils.numberToPointerSize(placeHeader.getNumZips()));
                                poi.setZip(zips.get(zipIndex-1));
                        }
                        
@@ -442,12 +433,9 @@ public class LBLFileReader extends ImgFile {
                                boolean indexed = (lblinfo & 0x800000) != 0;
                                boolean overnightParking = (lblinfo & 0x400000) 
!= 0;
 
-                               int highwayIndex = 
(placeHeader.getNumHighways() > 255)
-                                       ? reader.getChar() : reader.get();
+                               int highwayIndex = 
reader.getUint(Utils.numberToPointerSize(placeHeader.getNumHighways()));
                                if (indexed) {
-                                       int eidx = (placeHeader.getNumExits() > 
255) ?
-                                                                       
reader.getChar() :
-                                                                       
reader.get();
+                                       int eidx = 
reader.getUint(Utils.numberToPointerSize(placeHeader.getNumExits()));
                                }
                        }
 
diff --git a/src/uk/me/parabola/imgfmt/app/lbl/POIRecord.java 
b/src/uk/me/parabola/imgfmt/app/lbl/POIRecord.java
index e87ca70..f7f5790 100644
--- a/src/uk/me/parabola/imgfmt/app/lbl/POIRecord.java
+++ b/src/uk/me/parabola/imgfmt/app/lbl/POIRecord.java
@@ -18,6 +18,7 @@ package uk.me.parabola.imgfmt.app.lbl;
 
 import java.util.List;
 
+import uk.me.parabola.imgfmt.Utils;
 import uk.me.parabola.imgfmt.app.Exit;
 import uk.me.parabola.imgfmt.app.ImgFileWriter;
 import uk.me.parabola.imgfmt.app.Label;
@@ -130,18 +131,12 @@ public class POIRecord {
                if (city != null)
                {
                        char cityIndex = (char) city.getIndex();
-                       if(numCities > 255)
-                               writer.putChar(cityIndex);
-                       else
-                               writer.put((byte)cityIndex);
+                       writer.putN(Utils.numberToPointerSize((int)numCities), 
cityIndex);
                }
 
                if (zip != null) {
                        char zipIndex = (char) zip.getIndex();
-                       if(numZips > 255)
-                               writer.putChar(zipIndex);
-                       else
-                               writer.put((byte) zipIndex);
+                       writer.putN(Utils.numberToPointerSize((int)numZips), 
zipIndex);
                }
 
                if (complexPhoneNumber != null)
@@ -171,17 +166,11 @@ public class POIRecord {
                        writer.put3(val);
 
                        char highwayIndex = (char)exit.getHighway().getIndex();
-                       if(numHighways > 255)
-                               writer.putChar(highwayIndex);
-                       else
-                               writer.put((byte)highwayIndex);
-                       
+                       
writer.putN(Utils.numberToPointerSize((int)numHighways), highwayIndex);
+
                        if(ef != null) {
                                char exitFacilityIndex = (char)ef.getIndex();
-                               if(numExitFacilities > 255)
-                                       writer.putChar(exitFacilityIndex);
-                               else
-                                       writer.put((byte)exitFacilityIndex);
+                               
writer.putN(Utils.numberToPointerSize((int)numExitFacilities), 
exitFacilityIndex);
                        }
                }
        }
@@ -242,9 +231,9 @@ public class POIRecord {
                int size = 3;
                if (exit != null) {
                        size += 3;
-                       size += (numHighways > 255)? 2 : 1;
+                       size += Utils.numberToPointerSize((int)numHighways);
                        if(!exit.getFacilities().isEmpty())
-                               size += (numExitFacilities > 255)? 2 : 1;
+                               size += 
Utils.numberToPointerSize((int)numExitFacilities);
                }
                if (POIGlobalFlags != getPOIFlags())
                        size += 1;
@@ -262,20 +251,13 @@ public class POIRecord {
                {
                        /*
                          depending on how many cities are in the LBL block we 
have
-                         to write one or two bytes 
+                         to write one to three bytes 
                        */
-               
-                       if(numCities > 255)
-                               size += 2;
-                       else
-                               size += 1;
+                       size += Utils.numberToPointerSize((int)numCities);
                }
                if (zip != null) {
-                       // depending on how many zips are in the LBL block we 
have to write one or two bytes
-                       if(numZips > 255)
-                          size += 2;                                           
-                       else
-                          size += 1;
+                       // depending on how many zips are in the LBL block we 
have to write one to three bytes
+                       size += Utils.numberToPointerSize((int)numZips);
                }
                return size;
        }
diff --git a/src/uk/me/parabola/imgfmt/app/lbl/PlacesFile.java 
b/src/uk/me/parabola/imgfmt/app/lbl/PlacesFile.java
index 4c0fac5..0bbbf0e 100644
--- a/src/uk/me/parabola/imgfmt/app/lbl/PlacesFile.java
+++ b/src/uk/me/parabola/imgfmt/app/lbl/PlacesFile.java
@@ -419,6 +419,14 @@ public class PlacesFile {
                return postalCodes.size();
        }
 
+       public int numHighways() {
+               return highways.size();
+       }
+
+       public int numExitFacilities() {
+               return exitFacilities.size();
+       }
+
        public void setSort(Sort sort) {
                this.sort = sort;
        }
diff --git a/src/uk/me/parabola/imgfmt/app/mdr/Mdr15.java 
b/src/uk/me/parabola/imgfmt/app/mdr/Mdr15.java
index 9f33ff8..9f8d730 100644
--- a/src/uk/me/parabola/imgfmt/app/mdr/Mdr15.java
+++ b/src/uk/me/parabola/imgfmt/app/mdr/Mdr15.java
@@ -132,7 +132,7 @@ public class Mdr15 extends MdrSection {
         * for this.
         */
        public int getSizeForRecord() {
-               return numberToPointerSize(nextOffset);
+               return Utils.numberToPointerSize(nextOffset);
        }
 
        /**
diff --git a/src/uk/me/parabola/imgfmt/app/mdr/Mdr17.java 
b/src/uk/me/parabola/imgfmt/app/mdr/Mdr17.java
index 767403c..283d122 100644
--- a/src/uk/me/parabola/imgfmt/app/mdr/Mdr17.java
+++ b/src/uk/me/parabola/imgfmt/app/mdr/Mdr17.java
@@ -64,7 +64,7 @@ public class Mdr17 extends MdrSection {
                        len <<= 1;
                        count++;
                }
-               putN(writer, count, len);
+               writer.putN(count, len);
 
                // Calculate the header. This code is unlikely to survive the 
finding of another example!
                // Have no idea what the real thinking behind this is.
diff --git a/src/uk/me/parabola/imgfmt/app/mdr/Mdr18.java 
b/src/uk/me/parabola/imgfmt/app/mdr/Mdr18.java
index 59b3477..7e0a17b 100644
--- a/src/uk/me/parabola/imgfmt/app/mdr/Mdr18.java
+++ b/src/uk/me/parabola/imgfmt/app/mdr/Mdr18.java
@@ -35,7 +35,7 @@ public class Mdr18 extends MdrSection implements 
HasHeaderFlags {
                int poiSize = getSizes().getSize(19);
                for (Mdr18Record pt : poiTypes) {
                        writer.putChar((char) (pt.getType() | 0x4000));
-                       putN(writer, poiSize, pt.getRecord());
+                       writer.putN(poiSize, pt.getRecord());
                }
        }
 
diff --git a/src/uk/me/parabola/imgfmt/app/mdr/Mdr19.java 
b/src/uk/me/parabola/imgfmt/app/mdr/Mdr19.java
index b134c7b..89208f6 100644
--- a/src/uk/me/parabola/imgfmt/app/mdr/Mdr19.java
+++ b/src/uk/me/parabola/imgfmt/app/mdr/Mdr19.java
@@ -69,7 +69,7 @@ public class Mdr19 extends MdrSection implements 
HasHeaderFlags {
                                index |= flag;
                                lastName = name;
                        }
-                       putN(writer, n, index);
+                       writer.putN(n, index);
 
                        int type = MdrUtils.fullTypeToNaturalType(p.getType());
                        if (type != lastType) {
diff --git a/src/uk/me/parabola/imgfmt/app/mdr/Mdr1MapIndex.java 
b/src/uk/me/parabola/imgfmt/app/mdr/Mdr1MapIndex.java
index 12cf0e4..13f6bbb 100644
--- a/src/uk/me/parabola/imgfmt/app/mdr/Mdr1MapIndex.java
+++ b/src/uk/me/parabola/imgfmt/app/mdr/Mdr1MapIndex.java
@@ -44,22 +44,7 @@ public class Mdr1MapIndex {
        }
 
        public void addPointer(int recordNumber) {
-               switch (pointerSize) {
-               case 4:
-                       subWriter.putInt(recordNumber);
-                       break;
-               case 3:
-                       subWriter.put3(recordNumber);
-                       break;
-               case 2:
-                       subWriter.putChar((char) recordNumber);
-                       break;
-               case 1:
-                       subWriter.put((byte) recordNumber);
-                       break;
-               default:
-                       assert false;
-               }
+               subWriter.putN(pointerSize, recordNumber);
        }
        
        private int sectionToSubsection(int n) {
diff --git a/src/uk/me/parabola/imgfmt/app/mdr/Mdr25.java 
b/src/uk/me/parabola/imgfmt/app/mdr/Mdr25.java
index cf4b94a..ec3bb23 100644
--- a/src/uk/me/parabola/imgfmt/app/mdr/Mdr25.java
+++ b/src/uk/me/parabola/imgfmt/app/mdr/Mdr25.java
@@ -81,7 +81,7 @@ public class Mdr25 extends MdrSection {
        public void writeSectData(ImgFileWriter writer) {
                int size = getItemSize();
                for (Mdr5Record city : cities) {
-                       putN(writer, size,  city.getGlobalCityIndex());
+                       writer.putN(size,  city.getGlobalCityIndex());
                }
        }
 
diff --git a/src/uk/me/parabola/imgfmt/app/mdr/Mdr26.java 
b/src/uk/me/parabola/imgfmt/app/mdr/Mdr26.java
index 8882e84..8780773 100644
--- a/src/uk/me/parabola/imgfmt/app/mdr/Mdr26.java
+++ b/src/uk/me/parabola/imgfmt/app/mdr/Mdr26.java
@@ -74,7 +74,7 @@ public class Mdr26 extends MdrSection {
        public void writeSectData(ImgFileWriter writer) {
                int size = getSizes().getSize(28);
                for (Mdr28Record record : index) {
-                       putN(writer, size, record.getIndex());
+                       writer.putN(size, record.getIndex());
                }
        }
 
diff --git a/src/uk/me/parabola/imgfmt/app/mdr/Mdr27.java 
b/src/uk/me/parabola/imgfmt/app/mdr/Mdr27.java
index 095c3a5..0606025 100644
--- a/src/uk/me/parabola/imgfmt/app/mdr/Mdr27.java
+++ b/src/uk/me/parabola/imgfmt/app/mdr/Mdr27.java
@@ -76,7 +76,7 @@ public class Mdr27 extends MdrSection {
        public void writeSectData(ImgFileWriter writer) {
                int size = getItemSize();
                for (Mdr5Record city : cities) {
-                       putN(writer, size,  city.getGlobalCityIndex());
+                       writer.putN(size,  city.getGlobalCityIndex());
                }
        }
 
diff --git a/src/uk/me/parabola/imgfmt/app/mdr/Mdr28.java 
b/src/uk/me/parabola/imgfmt/app/mdr/Mdr28.java
index 0797608..8aa5e37 100644
--- a/src/uk/me/parabola/imgfmt/app/mdr/Mdr28.java
+++ b/src/uk/me/parabola/imgfmt/app/mdr/Mdr28.java
@@ -73,10 +73,10 @@ public class Mdr28 extends MdrSection implements 
HasHeaderFlags {
                int size27 = sizes.getSize(27);
 
                for (Mdr28Record mdr28 : index) {
-                       putN(writer, size23, mdr28.getMdr23());
+                       writer.putN(size23, mdr28.getMdr23());
                        putStringOffset(writer, mdr28.getStrOffset());
-                       putN(writer, size21, mdr28.getMdr21());
-                       putN(writer, size27, mdr28.getMdr27());
+                       writer.putN(size21, mdr28.getMdr21());
+                       writer.putN(size27, mdr28.getMdr27());
                }
        }
 
diff --git a/src/uk/me/parabola/imgfmt/app/mdr/Mdr29.java 
b/src/uk/me/parabola/imgfmt/app/mdr/Mdr29.java
index 7287918..62caed7 100644
--- a/src/uk/me/parabola/imgfmt/app/mdr/Mdr29.java
+++ b/src/uk/me/parabola/imgfmt/app/mdr/Mdr29.java
@@ -15,6 +15,7 @@ package uk.me.parabola.imgfmt.app.mdr;
 import java.util.ArrayList;
 import java.util.List;
 
+import uk.me.parabola.imgfmt.Utils;
 import uk.me.parabola.imgfmt.app.ImgFileWriter;
 import uk.me.parabola.imgfmt.app.srt.Sort;
 import uk.me.parabola.imgfmt.app.srt.SortKey;
@@ -82,17 +83,17 @@ public class Mdr29 extends MdrSection implements 
HasHeaderFlags {
                int size22 = sizes.getSize(22);
                int size25 = sizes.getSize(5);  // NB appears to be size of 5 
(cities), not 25 (cities with country).
                int size26 = has26? sizes.getSize(26): 0;
-               int size17 = numberToPointerSize(max17);
+               int size17 = Utils.numberToPointerSize(max17);
                for (Mdr29Record record : index) {
-                       putN(writer, size24, record.getMdr24());
+                       writer.putN(size24, record.getMdr24());
                        if (hasString)
                                putStringOffset(writer, record.getStrOffset());
-                       putN(writer, size22, record.getMdr22());
-                       putN(writer, size25, record.getMdr25());
+                       writer.putN(size22, record.getMdr22());
+                       writer.putN(size25, record.getMdr25());
                        if (has26)
-                               putN(writer, size26, record.getMdr26());
+                               writer.putN(size26, record.getMdr26());
                        if (has17)
-                               putN(writer, size17, record.getMdr17());
+                               writer.putN(size17, record.getMdr17());
                }
        }
 
@@ -111,7 +112,7 @@ public class Mdr29 extends MdrSection implements 
HasHeaderFlags {
                                ;
                if (isForDevice()) {
                        if (!getConfig().getSort().isMulti())
-                               size += numberToPointerSize(max17);
+                               size += Utils.numberToPointerSize(max17);
                } else {
                        size += sizes.getStrOffSize();
                        size += sizes.getSize(26);
@@ -138,7 +139,7 @@ public class Mdr29 extends MdrSection implements 
HasHeaderFlags {
                if (isForDevice()) {
                        int magic = 0x6; // 22 and 25
                        if (!getConfig().getSort().isMulti())
-                               magic |= numberToPointerSize(max17) << 4;
+                               magic |= Utils.numberToPointerSize(max17) << 4;
                        return magic; // +17, -26, -strings
                }
                else
diff --git a/src/uk/me/parabola/imgfmt/app/mdr/Mdr2x.java 
b/src/uk/me/parabola/imgfmt/app/mdr/Mdr2x.java
index 30a428b..2e00eb4 100644
--- a/src/uk/me/parabola/imgfmt/app/mdr/Mdr2x.java
+++ b/src/uk/me/parabola/imgfmt/app/mdr/Mdr2x.java
@@ -70,7 +70,7 @@ public abstract class Mdr2x extends MdrMapSection implements 
HasHeaderFlags {
                                        int trailingFlags = ((rr & 1) == 0) ? 1 
: 0;
                                        // trailingFlags |= s.getB() << 1;
                                        // trailingFlags |= s.getS() << (1 + 
partialBShift);
-                                       putN(writer, partialInfoSize, 
trailingFlags);
+                                       writer.putN(partialInfoSize, 
trailingFlags);
                                }
                        } else {
                                int rr = street.checkFullRepeat(prev, collator);
@@ -78,7 +78,7 @@ public abstract class Mdr2x extends MdrMapSection implements 
HasHeaderFlags {
                                        repeat = 0;
 
                                int index = street.getIndex();
-                               putN(writer, size, (index << 1) | repeat);
+                               writer.putN(size, (index << 1) | repeat);
                        }
 
                        prev = street;
diff --git a/src/uk/me/parabola/imgfmt/app/mdr/Mdr5.java 
b/src/uk/me/parabola/imgfmt/app/mdr/Mdr5.java
index bc9b045..fd384e9 100644
--- a/src/uk/me/parabola/imgfmt/app/mdr/Mdr5.java
+++ b/src/uk/me/parabola/imgfmt/app/mdr/Mdr5.java
@@ -17,6 +17,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
+import uk.me.parabola.imgfmt.Utils;
 import uk.me.parabola.imgfmt.app.ImgFileWriter;
 import uk.me.parabola.imgfmt.app.srt.MultiSortKey;
 import uk.me.parabola.imgfmt.app.srt.Sort;
@@ -51,7 +52,7 @@ public class Mdr5 extends MdrMapSection {
         * Called after all cities to sort and number them.
         */
        public void preWriteImpl() {
-               localCitySize = numberToPointerSize(maxCityIndex + 1);
+               localCitySize = Utils.numberToPointerSize(maxCityIndex + 1);
 
                List<SortKey<Mdr5Record>> sortKeys = new 
ArrayList<>(allCities.size());
                Sort sort = getConfig().getSort();
@@ -216,7 +217,7 @@ public class Mdr5 extends MdrMapSection {
                                writer.putChar((char) region);
                        if (hasString)
                                putStringOffset(writer, city.getStringOffset());
-                       putN(writer, size20, city.getMdr20());
+                       writer.putN(size20, city.getMdr20());
                }
        }
 
@@ -225,10 +226,7 @@ public class Mdr5 extends MdrMapSection {
         * and not the global city index used in mdr11.
         */
        private void putLocalCityIndex(ImgFileWriter writer, int cityIndex) {
-               if (localCitySize == 2) // 3 probably not possible in actual 
maps.
-                       writer.putChar((char) cityIndex);
-               else
-                       writer.put((byte) cityIndex);
+               writer.putN(localCitySize, cityIndex);
        }
 
        /**
diff --git a/src/uk/me/parabola/imgfmt/app/mdr/Mdr6.java 
b/src/uk/me/parabola/imgfmt/app/mdr/Mdr6.java
index 249a0d7..f1ffef2 100644
--- a/src/uk/me/parabola/imgfmt/app/mdr/Mdr6.java
+++ b/src/uk/me/parabola/imgfmt/app/mdr/Mdr6.java
@@ -56,7 +56,7 @@ public class Mdr6 extends MdrMapSection {
                        addIndexPointer(z.getMapIndex(), record++);
 
                        putMapIndex(writer, z.getMapIndex());
-                       putN(writer, zipSize, z.getZipIndex());
+                       writer.putN(zipSize, z.getZipIndex());
                        if (hasString)
                                putStringOffset(writer, z.getStringOffset());
                }
diff --git a/src/uk/me/parabola/imgfmt/app/mdr/Mdr7.java 
b/src/uk/me/parabola/imgfmt/app/mdr/Mdr7.java
index 637a8e9..63b7992 100644
--- a/src/uk/me/parabola/imgfmt/app/mdr/Mdr7.java
+++ b/src/uk/me/parabola/imgfmt/app/mdr/Mdr7.java
@@ -367,7 +367,7 @@ public class Mdr7 extends MdrMapSection {
                                int trailingFlags = ((rr & 1) == 0) ? 1 : 0;
                                // trailingFlags |= s.getB() << 1;
                                // trailingFlags |= s.getS() << (1 + 
partialBShift);
-                               putN(writer, partialInfoSize, trailingFlags);
+                               writer.putN(partialInfoSize, trailingFlags);
                        }
                        last = s;
                }
diff --git a/src/uk/me/parabola/imgfmt/app/mdr/Mdr8.java 
b/src/uk/me/parabola/imgfmt/app/mdr/Mdr8.java
index c250b72..3c6e73a 100644
--- a/src/uk/me/parabola/imgfmt/app/mdr/Mdr8.java
+++ b/src/uk/me/parabola/imgfmt/app/mdr/Mdr8.java
@@ -44,7 +44,7 @@ public class Mdr8 extends MdrSection implements 
HasHeaderFlags {
                        for (int i = 0; i< STRING_WIDTH; i++) {
                                writer.put((byte) s.getPrefix()[i]);
                        }
-                       putN(writer, size, s.getRecordNumber());
+                       writer.putN(size, s.getRecordNumber());
                }
        }
 
diff --git a/src/uk/me/parabola/imgfmt/app/mdr/Mdr9.java 
b/src/uk/me/parabola/imgfmt/app/mdr/Mdr9.java
index 58ebc33..acc115c 100644
--- a/src/uk/me/parabola/imgfmt/app/mdr/Mdr9.java
+++ b/src/uk/me/parabola/imgfmt/app/mdr/Mdr9.java
@@ -36,7 +36,7 @@ public class Mdr9 extends MdrSection implements 
HasHeaderFlags {
                for (Map.Entry<Integer, Integer> ent : index.entrySet()) {
                        int group = ent.getKey();
                        writer.put((byte) group);
-                       putN(writer, poiSize, ent.getValue());
+                       writer.putN(poiSize, ent.getValue());
                }
        }
 
diff --git a/src/uk/me/parabola/imgfmt/app/mdr/MdrMapSection.java 
b/src/uk/me/parabola/imgfmt/app/mdr/MdrMapSection.java
index 14ab889..88bf9e6 100644
--- a/src/uk/me/parabola/imgfmt/app/mdr/MdrMapSection.java
+++ b/src/uk/me/parabola/imgfmt/app/mdr/MdrMapSection.java
@@ -12,6 +12,7 @@
  */
 package uk.me.parabola.imgfmt.app.mdr;
 
+import uk.me.parabola.imgfmt.Utils;
 import uk.me.parabola.imgfmt.app.ImgFileWriter;
 
 /**
@@ -37,7 +38,7 @@ public abstract class MdrMapSection extends MdrSection 
implements HasHeaderFlags
                // There are no flags or minimums required here, unlike in 
setPointerSize()
                // which does a similar thing.
                int n = getNumberOfItems();
-               index.setPointerSize(sectionNumber, numberToPointerSize(n));
+               index.setPointerSize(sectionNumber, 
Utils.numberToPointerSize(n));
        }
 
        /**
@@ -52,18 +53,18 @@ public abstract class MdrMapSection extends MdrSection 
implements HasHeaderFlags
 
        protected void putCityIndex(ImgFileWriter writer, int cityIndex, 
boolean isNew) {
                int flag = (isNew && cityIndex > 0)? getSizes().getCityFlag(): 
0;
-               putN(writer, getSizes().getCitySizeFlagged(), cityIndex | flag);
+               writer.putN(getSizes().getCitySizeFlagged(), cityIndex | flag);
        }
 
        protected void putRegionIndex(ImgFileWriter writer, int region) {
                // This is only called when putCityIndex might also be called 
and so has to be
                // the same size (probably ;)
-               putN(writer, getSizes().getCitySizeFlagged(), region);
+               writer.putN(getSizes().getCitySizeFlagged(), region);
        }
 
        protected void putPoiIndex(ImgFileWriter writer, int poiIndex, boolean 
isNew) {
                int flag = isNew? getSizes().getPoiFlag(): 0;
-               putN(writer, getSizes().getPoiSizeFlagged(), poiIndex | flag);
+               writer.putN(getSizes().getPoiSizeFlagged(), poiIndex | flag);
        }
 
        protected boolean hasFlag(int val) {
diff --git a/src/uk/me/parabola/imgfmt/app/mdr/MdrSection.java 
b/src/uk/me/parabola/imgfmt/app/mdr/MdrSection.java
index a851293..a33beeb 100644
--- a/src/uk/me/parabola/imgfmt/app/mdr/MdrSection.java
+++ b/src/uk/me/parabola/imgfmt/app/mdr/MdrSection.java
@@ -12,6 +12,7 @@
  */
 package uk.me.parabola.imgfmt.app.mdr;
 
+import uk.me.parabola.imgfmt.Utils;
 import uk.me.parabola.imgfmt.app.ImgFileWriter;
 
 /**
@@ -48,42 +49,11 @@ public abstract class MdrSection extends ConfigBase {
        }
 
        protected void putMapIndex(ImgFileWriter writer, int mapIndex) {
-               putN(writer, sizes.getMapSize(), mapIndex);
+               writer.putN(sizes.getMapSize(), mapIndex);
        }
 
        protected void putStringOffset(ImgFileWriter writer, int strOff) {
-               putN(writer, sizes.getStrOffSize(), strOff);
-       }
-
-       protected void putN(ImgFileWriter writer, int n, int value) {
-               switch (n) {
-               case 1:
-                       writer.put((byte) value);
-                       break;
-               case 2:
-                       writer.putChar((char) value);
-                       break;
-               case 3:
-                       writer.put3(value);
-                       break;
-               case 4:
-                       writer.putInt(value);
-                       break;
-               default: // Don't write anything.
-                       assert false;
-                       break;
-               }
-       }
-
-       protected static int numberToPointerSize(int n) {
-               if (n > 0xffffff)
-                       return 4;
-               else if (n > 0xffff)
-                       return 3;
-               else if (n > 0xff)
-                       return 2;
-               else
-                       return 1;
+               writer.putN(sizes.getStrOffSize(), strOff);
        }
 
        /**
@@ -113,7 +83,7 @@ public abstract class MdrSection extends ConfigBase {
         * to store the largest record number in this section.
         */
        public int getSizeForRecord() {
-               return numberToPointerSize(getNumberOfItems());
+               return Utils.numberToPointerSize(getNumberOfItems());
        }
 
        /**
@@ -178,7 +148,7 @@ public abstract class MdrSection extends ConfigBase {
                 * one bit flag.
                 */
                public int getCitySizeFlagged() {
-                       return Math.max(2, 
numberToPointerSize(sections[5].getNumberOfItems() << 1));
+                       return Math.max(2, 
Utils.numberToPointerSize(sections[5].getNumberOfItems() << 1));
                }
 
                public int getCityFlag() {
@@ -190,7 +160,7 @@ public abstract class MdrSection extends ConfigBase {
                }
 
                public int getStreetSizeFlagged() {
-                       return 
numberToPointerSize(sections[7].getNumberOfItems() << 1);
+                       return 
Utils.numberToPointerSize(sections[7].getNumberOfItems() << 1);
                }
 
                public int getPoiSize() {
@@ -207,7 +177,7 @@ public abstract class MdrSection extends ConfigBase {
                 * and a flag bit.
                 */
                public int getPoiSizeFlagged() {
-                       return 
numberToPointerSize(sections[11].getNumberOfItems() << 1);
+                       return 
Utils.numberToPointerSize(sections[11].getNumberOfItems() << 1);
                }
 
                public int getPoiFlag() {
diff --git a/src/uk/me/parabola/imgfmt/app/mdr/PrefixIndex.java 
b/src/uk/me/parabola/imgfmt/app/mdr/PrefixIndex.java
index 4e416d8..4d16149 100644
--- a/src/uk/me/parabola/imgfmt/app/mdr/PrefixIndex.java
+++ b/src/uk/me/parabola/imgfmt/app/mdr/PrefixIndex.java
@@ -16,6 +16,7 @@ import java.text.Collator;
 import java.util.ArrayList;
 import java.util.List;
 
+import uk.me.parabola.imgfmt.Utils;
 import uk.me.parabola.imgfmt.app.ImgFileWriter;
 import uk.me.parabola.imgfmt.app.srt.Sort;
 import uk.me.parabola.imgfmt.app.srt.Sort.SrtCollator;
@@ -114,17 +115,17 @@ public class PrefixIndex extends MdrSection {
         * Write the section or subsection.
         */
        public void writeSectData(ImgFileWriter writer) {
-               int size = numberToPointerSize(maxIndex);
+               int size = Utils.numberToPointerSize(maxIndex);
                for (Mdr8Record s : index) {
                        for (int i = 0; i< prefixLength; i++) {
                                writer.put((byte) s.getPrefix()[i]);
                        }
-                       putN(writer, size, s.getRecordNumber());
+                       writer.putN(size, s.getRecordNumber());
                }
        }
 
        public int getItemSize() {
-               return prefixLength + numberToPointerSize(maxIndex);
+               return prefixLength + Utils.numberToPointerSize(maxIndex);
        }
 
        protected int numberOfItems() {
diff --git a/src/uk/me/parabola/imgfmt/app/net/NETFileReader.java 
b/src/uk/me/parabola/imgfmt/app/net/NETFileReader.java
index 6863f13..e3fbbb5 100644
--- a/src/uk/me/parabola/imgfmt/app/net/NETFileReader.java
+++ b/src/uk/me/parabola/imgfmt/app/net/NETFileReader.java
@@ -22,6 +22,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import uk.me.parabola.imgfmt.Utils;
 import uk.me.parabola.imgfmt.app.BufferedImgFileReader;
 import uk.me.parabola.imgfmt.app.ImgFile;
 import uk.me.parabola.imgfmt.app.ImgFileReader;
@@ -152,7 +153,7 @@ public class NETFileReader extends ImgFile {
                indexes.clear();
                if (flag == 2) {
                        // fetch city/zip index
-                       int ind = (size == 2)? reader.getChar(): (reader.get() 
& 0xff);
+                       int ind = reader.getUint(size);
                        if (ind != 0)
                                indexes.add(ind-1);
                } else if (flag == 3) {
@@ -209,15 +210,7 @@ public class NETFileReader extends ImgFile {
                        assert false : "ERRROR overflow";
                        return 0;
                }
-               int cnum;
-               if (size == 1)
-                       cnum = reader.get() & 0xff;
-               else if (size == 2)
-                       cnum = reader.getChar();
-               else {
-                       assert false : "unexpected size value" + size;
-                       return 0;
-               }
+               int cnum = reader.getUint(size);
                return cnum;
        }
 
@@ -300,12 +293,12 @@ public class NETFileReader extends ImgFile {
 
        public void setCities(List<City> cities) {
                this.cities = cities;
-               this.citySize = cities.size() > 255? 2: 1;
+               this.citySize = Utils.numberToPointerSize(cities.size());
        }
 
        public void setZips(List<Zip> zips) {
                this.zips = zips;
-               this.zipSize = zips.size() > 255? 2: 1;
+               this.zipSize = Utils.numberToPointerSize(zips.size());
        }
 
        public void setLabels(LBLFileReader labels) {
diff --git a/src/uk/me/parabola/imgfmt/app/net/NumberPreparer.java 
b/src/uk/me/parabola/imgfmt/app/net/NumberPreparer.java
index 4b48d47..ecc9f8d 100644
--- a/src/uk/me/parabola/imgfmt/app/net/NumberPreparer.java
+++ b/src/uk/me/parabola/imgfmt/app/net/NumberPreparer.java
@@ -13,10 +13,10 @@
 package uk.me.parabola.imgfmt.app.net;
 
 import java.io.ByteArrayOutputStream;
-import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 
+import uk.me.parabola.imgfmt.Utils;
 import uk.me.parabola.imgfmt.app.BitWriter;
 import uk.me.parabola.imgfmt.app.lbl.City;
 import uk.me.parabola.imgfmt.app.lbl.Zip;
@@ -998,12 +998,14 @@ class CityZipWriter {
        void writeIndex(int val){
                if (val <= 0)
                        return;
-               if (numItems > 255){
-                       buf.write((byte) val & 0xff);
-                       buf.write((byte) (val >> 8));
-               }
-               else 
-                       buf.write((byte) val);
+               int ptrSize = Utils.numberToPointerSize(numItems);
+               buf.write(val);
+               if (ptrSize <= 1)
+                       return;
+               buf.write(val >> 8);
+               if (ptrSize <= 2)
+                       return;
+               buf.write(val >> 16);
        }
 
 }
diff --git a/src/uk/me/parabola/imgfmt/app/net/RoadDef.java 
b/src/uk/me/parabola/imgfmt/app/net/RoadDef.java
index cc38c9e..7976a45 100644
--- a/src/uk/me/parabola/imgfmt/app/net/RoadDef.java
+++ b/src/uk/me/parabola/imgfmt/app/net/RoadDef.java
@@ -27,6 +27,7 @@ import java.util.SortedMap;
 import java.util.TreeMap;
 
 import uk.me.parabola.imgfmt.MapFailedException;
+import uk.me.parabola.imgfmt.Utils;
 import uk.me.parabola.imgfmt.app.BitWriter;
 import uk.me.parabola.imgfmt.app.ImgFileWriter;
 import uk.me.parabola.imgfmt.app.Label;
@@ -243,7 +244,7 @@ public class RoadDef {
                        len = (numbers == null)  ? 0: 
numbers.zipWriter.getBuffer().size();
                        if (len > 0){
                                zipBuf = numbers.zipWriter.getBuffer();
-                               flag = (len > 255) ? 1 : 0;
+                               flag = Utils.numberToPointerSize(len) - 1;
                        } else 
                                flag = (zip == null) ? 3 : 2;
                        code |= flag << 2;
@@ -251,14 +252,14 @@ public class RoadDef {
                        len = (numbers == null)  ? 0: 
numbers.cityWriter.getBuffer().size();
                        if (len > 0){
                                cityBuf = numbers.cityWriter.getBuffer();
-                               flag = (len > 255) ? 1 : 0;
+                               flag = Utils.numberToPointerSize(len) - 1;
                        } else 
                                flag = (city == null) ? 3 : 2;
                        code |= flag << 4;
                        
                        len = (numbers == null) ? 0 : 
numbers.fetchBitStream().getLength();
                        if (len > 0){
-                               flag = (len > 255) ? 1 : 0;
+                               flag = Utils.numberToPointerSize(len) - 1;
                        } else 
                                flag = 3;
                        code |= flag << 6;
@@ -268,42 +269,27 @@ public class RoadDef {
                        
                        if (zipBuf != null){
                                len = zipBuf.size();
-                               if (len > 255)
-                                       writer.putChar((char) len);
-                               else
-                                       writer.put((byte) len);
+                               writer.putN(Utils.numberToPointerSize(len), 
len);
                                writer.put(zipBuf.toByteArray());
                        } else {
                                if(zip != null) {
                                        char zipIndex = (char)zip.getIndex();
-                                       if(numZips > 255)
-                                               writer.putChar(zipIndex);
-                                       else
-                                               writer.put((byte)zipIndex);
+                                       
writer.putN(Utils.numberToPointerSize(numZips), zipIndex);
                                }
                        }
                        if (cityBuf != null){
                                len = cityBuf.size();
-                               if (len > 255)
-                                       writer.putChar((char) len);
-                               else
-                                       writer.put((byte) len);
+                               writer.putN(Utils.numberToPointerSize(len), 
len);
                                writer.put(cityBuf.toByteArray());
                        } else {
                                if(city != null) {
                                        char cityIndex = (char)city.getIndex();
-                                       if(numCities > 255)
-                                               writer.putChar(cityIndex);
-                                       else
-                                               writer.put((byte)cityIndex);
+                                       
writer.putN(Utils.numberToPointerSize(numCities), cityIndex);
                                }
                        }
                        if (numbers != null) {
                                BitWriter bw = numbers.fetchBitStream();
-                               if (bw.getLength() > 255)
-                                       writer.putChar((char) bw.getLength());
-                               else
-                                       writer.put((byte) bw.getLength());
+                               
writer.putN(Utils.numberToPointerSize(bw.getLength()), bw.getLength());
                                writer.put(bw.getBytes(), 0, bw.getLength());
                        }
                }
diff --git a/src/uk/me/parabola/imgfmt/app/typ/TYPFile.java 
b/src/uk/me/parabola/imgfmt/app/typ/TYPFile.java
index e19208c..8b0b4fb 100644
--- a/src/uk/me/parabola/imgfmt/app/typ/TYPFile.java
+++ b/src/uk/me/parabola/imgfmt/app/typ/TYPFile.java
@@ -135,24 +135,24 @@ public class TYPFile extends ImgFile {
 
        private void writeStrIndex(ImgFileWriter in) {
                SectionWriter writer = 
header.getStringIndex().makeSectionWriter(in);
-               int psize = ptrSize(header.getLabels().getSize());
+               int psize = 
Utils.numberToPointerSize(header.getLabels().getSize());
                header.getStringIndex().setItemSize((char) (3 + psize));
 
                for (Map.Entry<Integer, Integer> ent : strToType.entrySet()) {
-                       putN(writer, psize, ent.getKey());
-                       putN(writer, 3, ent.getValue());
+                       writer.putN(psize, ent.getKey());
+                       writer.put3(ent.getValue());
                }
                Utils.closeFile(writer);
        }
 
        private void writerTypeIndex(ImgFileWriter in) {
                SectionWriter writer = 
header.getTypeIndex().makeSectionWriter(in);
-               int psize = ptrSize(header.getLabels().getSize());
+               int psize = 
Utils.numberToPointerSize(header.getLabels().getSize());
                header.getTypeIndex().setItemSize((char) (3 + psize));
 
                for (Map.Entry<Integer, Integer> ent : typeToStr.entrySet()) {
-                       putN(writer, 3, ent.getKey());
-                       putN(writer, psize, ent.getValue());
+                       writer.put3(ent.getKey());
+                       writer.putN(psize, ent.getValue());
                }
                Utils.closeFile(writer);
        }
@@ -170,7 +170,7 @@ public class TYPFile extends ImgFile {
 
                int size = dataSection.getSize();
                int typeSize = indexSection.getItemSize();
-               int psize = ptrSize(size);
+               int psize = Utils.numberToPointerSize(size);
 
                indexSection.setItemSize((char) (typeSize + psize));
 
@@ -178,8 +178,8 @@ public class TYPFile extends ImgFile {
                for (TypElement elem : elementData) {
                        int offset = elem.getOffset();
                        int type = elem.getTypeForFile();
-                       putN(subWriter, typeSize, type);
-                       putN(subWriter, psize, offset);
+                       subWriter.putN(typeSize, type);
+                       subWriter.putN(psize, offset);
                }
                Utils.closeFile(subWriter);
 
@@ -195,37 +195,6 @@ public class TYPFile extends ImgFile {
                }
        }
 
-       private int ptrSize(int size) {
-               int psize = 1;
-               if (size > 0xffffff)
-                       psize = 4;
-               else if (size > 0xffff)
-                       psize = 3;
-               else if (size > 0xff)
-                       psize = 2;
-               return psize;
-       }
-
-       protected void putN(ImgFileWriter writer, int n, int value) {
-               switch (n) {
-               case 1:
-                       writer.put((byte) value);
-                       break;
-               case 2:
-                       writer.putChar((char) value);
-                       break;
-               case 3:
-                       writer.put3(value);
-                       break;
-               case 4:
-                       writer.putInt(value);
-                       break;
-               default: // Don't write anything.
-                       assert false;
-                       break;
-               }
-       }
-       
        public void setData(TypData data) {
                this.data = data;
                TypParam param = data.getParam();
diff --git a/src/uk/me/parabola/mkgmap/build/MapBuilder.java 
b/src/uk/me/parabola/mkgmap/build/MapBuilder.java
index 0afecb6..c030855 100644
--- a/src/uk/me/parabola/mkgmap/build/MapBuilder.java
+++ b/src/uk/me/parabola/mkgmap/build/MapBuilder.java
@@ -267,8 +267,26 @@ public class MapBuilder implements Configurable {
                        }
                        netFile.writePost(rgnFile.getWriter());
                }
+               warnAbout3ByteImgRefs();
        }
-       
+
+       private void warnAbout3ByteImgRefs() {
+               String infoMsg = "- more than 65535 might cause indexing 
problems and excess size. Suggest splitter with lower --max-nodes";
+               int itemCount;
+               itemCount = lblFile.numCities();
+               if (itemCount > 0xffff)
+                       log.error("Map contains", itemCount, "Cities", infoMsg);
+               itemCount = lblFile.numZips();
+               if (itemCount > 0xffff)
+                       log.error("Map contains", itemCount, "Zips", infoMsg);
+               itemCount = lblFile.numHighways();
+               if (itemCount > 0xffff)
+                       log.error("Map contains", itemCount, "Highways", 
infoMsg);
+               itemCount = lblFile.numExitFacilities();
+               if (itemCount > 0xffff)
+                       log.error("Map contains", itemCount, "Exit facilities", 
infoMsg);
+       } // warnAbout3ByteImgRefs
+
        private Country getDefaultCountry() {
                if (defaultCountry == null && lblFile != null) {
                        defaultCountry = lblFile.createCountry(countryName, 
countryAbbr);
diff --git a/src/uk/me/parabola/mkgmap/filters/MustSplitException.java 
b/src/uk/me/parabola/mkgmap/filters/MustSplitException.java
index 3efbf19..b57017c 100644
--- a/src/uk/me/parabola/mkgmap/filters/MustSplitException.java
+++ b/src/uk/me/parabola/mkgmap/filters/MustSplitException.java
@@ -1,15 +1,14 @@
 /*
  * Copyright (C) 2017
  * 
- *  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.
- * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 or
+ * 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.
  * 
  */
 package uk.me.parabola.mkgmap.filters;
diff --git 
a/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberGenerator.java 
b/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberGenerator.java
index ff99406..b045351 100644
--- a/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberGenerator.java
+++ b/src/uk/me/parabola/mkgmap/osmstyle/housenumber/HousenumberGenerator.java
@@ -1534,10 +1534,7 @@ public class HousenumberGenerator {
                        if (dDist != 0d) {
                                return (int)Math.signum(dDist);
                        }
-                       if (d != 0)
-                               return d;
-                       d  = Long.compare(o1.getElement().getId(), 
o2.getElement().getId());
-                       return d;
+                       return Long.compare(o1.getElement().getId(), 
o2.getElement().getId());
                }
        }
        /**
diff --git a/src/uk/me/parabola/util/ShapeSplitter.java 
b/src/uk/me/parabola/util/ShapeSplitter.java
index 6fc14f5..6fc9c31 100644
--- a/src/uk/me/parabola/util/ShapeSplitter.java
+++ b/src/uk/me/parabola/util/ShapeSplitter.java
@@ -279,31 +279,7 @@ public class ShapeSplitter {
 
 /* Dec16/Jan17. Ticker Berkin. New implementation for splitting shapes.
 
-Eventually maybe can be used instead of some of the above and in following 
code:
-
-done   mkgmap/build/MapArea.java
-       mkgmap/filters/PolygonSplitterBase.java
-       mkgmap/filters/ShapeMergeFilter.java
-       mkgmap/general/AreaClipper.java
-       mkgmap/general/PolygonClipper.java
-       mkgmap/reader/osm/MultiPolygonRelation.java
-Maybe not this lot:
-       mkgmap/reader/osm/boundary/BoundaryConverter.java
-       mkgmap/reader/osm/boundary/BoundaryCoverageUtil.java
-       mkgmap/reader/osm/boundary/BoundaryDiff.java
-       mkgmap/reader/osm/boundary/BoundaryElement.java
-       mkgmap/reader/osm/boundary/BoundaryFile2Gpx.java
-       mkgmap/reader/osm/boundary/BoundaryQuadTree.java
-       mkgmap/reader/osm/boundary/BoundaryRelation.java
-       mkgmap/reader/osm/boundary/BoundarySaver.java
-       mkgmap/reader/osm/boundary/BoundaryUtil.java
-? not sure about these
-       mkgmap/reader/osm/SeaGenerator.java
-       mkgmap/sea/optional/PrecompSeaGenerator.java
-       mkgmap/sea/optional/PrecompSeaMerger.java
-       util/ElementQuadTreeNode.java
-       util/Java2DConverter.java
-       util/QuadTreeNode.java
+Eventually maybe can be used instead of some of the above and elsewhere
 */
 
        /**
@@ -327,7 +303,7 @@ Maybe not this lot:
                        MergeCloseHelper thisLine = lineInfo.get(inx);
                        if (thisLine.highPoint > endEnclosed) // only do 
enclosed items
                                break; // simple - fully enclosed
-                       if (thisLine.highPoint == endEnclosed && 
thisLine.highPoint == endEnclosed) // consider carefully
+                       if (thisLine.lowPoint == endEnclosed && 
thisLine.highPoint == endEnclosed) // consider carefully
                                if (calledFromHole == (thisLine.areaOrHole == 
-1))
                                        break; // stop if same type
                        inx = doLines(inx+1, thisLine.highPoint, calledFromHole 
? thisLine : null, lineInfo, origList);
diff --git a/test/func/lib/ArrayImgWriter.java 
b/test/func/lib/ArrayImgWriter.java
index 437da23..bf70e91 100644
--- a/test/func/lib/ArrayImgWriter.java
+++ b/test/func/lib/ArrayImgWriter.java
@@ -46,12 +46,34 @@ public class ArrayImgWriter implements ImgFileWriter {
                out.write((c >> 8) & 0xff);
        }
 
+       public void put1(int val) {
+               out.write(val & 0xff);
+       }
+
+       public void put2(int val) {
+               out.write(val & 0xff);
+               out.write((val >> 8) & 0xff);
+       }
+
        public void put3(int val) {
                out.write(val & 0xff);
                out.write((val >> 8) & 0xff);
                out.write((val >> 16) & 0xff);
        }
 
+       public void putN(int nBytes, int val) {
+               out.write(val & 0xff);
+               if (nBytes <= 1)
+                       return;
+               out.write((val >> 8) & 0xff);
+               if (nBytes <= 2)
+                       return;
+               out.write((val >> 16) & 0xff);
+               if (nBytes <= 3)
+                       return;
+               out.write((val >> 24) & 0xff);
+       }
+
        public void putInt(int val) {
                out.write(val & 0xff);
                out.write((val >> 8) & 0xff);

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-grass/mkgmap.git

_______________________________________________
Pkg-grass-devel mailing list
Pkg-grass-devel@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel

Reply via email to