[mkgmap] 01/04: New upstream version 0.0.0+svn3978

Bas Couwenberg sebastic at debian.org
Sat Aug 5 12:28:35 UTC 2017


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 <sebastic at 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



More information about the Pkg-grass-devel mailing list