Index: /applications/editors/josm/plugins/smed2/js57toosm/build.xml
===================================================================
--- /applications/editors/josm/plugins/smed2/js57toosm/build.xml	(revision 30188)
+++ /applications/editors/josm/plugins/smed2/js57toosm/build.xml	(revision 30188)
@@ -0,0 +1,27 @@
+<project name="js57toosm" default="dist" basedir=".">
+  <property name="src" location="src"/>
+  <property name="build" location="build"/>
+  <property name="dist"  location="dist"/>
+
+  <target name="init">
+    <mkdir dir="${build}"/>
+  </target>
+
+  <target name="compile" depends="init" description="compile the source " >
+    <javac srcdir="${src}" destdir="${build}"/>
+  </target>
+
+  <target name="dist" depends="compile" description="generate the distribution" >
+    <jar jarfile="./js57toosm.jar" basedir="${build}" >
+      <manifest>
+        <attribute name="Main-Class" value="Js57toosm"/>
+      </manifest>
+    </jar>
+  </target>
+
+  <target name="clean" description="clean up" >
+    <delete dir="${build}"/>
+    <delete dir="${dist}"/>
+    <delete file="./js57toosm.jar"/>
+  </target>
+</project>
Index: /applications/editors/josm/plugins/smed2/js57toosm/src/js57toosm/Js57toosm.java
===================================================================
--- /applications/editors/josm/plugins/smed2/js57toosm/src/js57toosm/Js57toosm.java	(revision 30188)
+++ /applications/editors/josm/plugins/smed2/js57toosm/src/js57toosm/Js57toosm.java	(revision 30188)
@@ -0,0 +1,172 @@
+/* Copyright 2013 Malcolm Herring
+ *
+ * This is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License.
+ *
+ * For a copy of the GNU General Public License, see <http://www.gnu.org/licenses/>.
+ */
+
+package js57toosm;
+
+import java.io.*;
+
+import s57.S57dat;
+import s57.S57dat.*;
+import s57.S57map;
+import s57.S57map.*;
+
+public class Js57toosm {
+	
+	public static int rnum = 0;
+
+	public static void main(String[] args) throws IOException {
+
+		FileInputStream in = new FileInputStream("/Users/mherring/boatsw/oseam/josm/plugins/smed2/js57toosm/tst.000");
+		PrintStream out = System.out;
+
+		byte[] leader = new byte[24];
+		boolean ddr = false;
+		int length;
+		int fields;
+		int mapfl, mapfp, mapts, entry;
+		String tag;
+		int len;
+		int pos;
+		
+		double comf = 1;
+		double somf = 1;
+		long name = 0;
+		S57map.Nflag nflag = Nflag.ANON;
+		S57map map = new S57map();
+		double minlat = 90, minlon = 180, maxlat = -90, maxlon = -180;
+
+		while (in.read(leader) == 24) {
+			length = Integer.parseInt(new String(leader, 0, 5)) - 24;
+			ddr = (leader[6] == 'L');
+			fields = Integer.parseInt(new String(leader, 12, 5)) - 24;
+			mapfl = leader[20] - '0';
+			mapfp = leader[21] - '0';
+			mapts = leader[23] - '0';
+			entry = mapfl + mapfp + mapts;
+			byte[] record = new byte[length];
+			if (in.read(record) != length)
+				break;
+			for (int idx = 0; idx < fields-1; idx += entry) {
+				tag = new String(record, idx, mapts);
+				len = Integer.parseInt(new String(record, idx+mapts, mapfl));
+				pos = Integer.parseInt(new String(record, idx+mapts+mapfl, mapfp));
+				if (!ddr) {
+    				if ("0001".equals(tag)) {
+    					int i8rn = ((Long)S57dat.getSubf(record, fields+pos, S57field.I8RI, S57subf.I8RN)).intValue();
+    					if (i8rn != ++rnum) {
+    						out.println("Out of order record ID");
+    						in.close();
+    						System.exit(-1);
+    					}
+    				} else if ("DSID".equals(tag)) {
+    				} else if ("DSSI".equals(tag)) {
+    				} else if ("DSPM".equals(tag)) {
+    					comf = (double)(Long)S57dat.getSubf(record, fields+pos, S57field.DSPM, S57subf.COMF);
+    					somf = (double)(Long)S57dat.getSubf(S57subf.SOMF);
+    				} else if ("FRID".equals(tag)) {
+    				} else if ("FOID".equals(tag)) {
+    				} else if ("ATTF".equals(tag)) {
+    				} else if ("NATF".equals(tag)) {
+    				} else if ("FFPC".equals(tag)) {
+    				} else if ("FFPT".equals(tag)) {
+    				} else if ("FSPC".equals(tag)) {
+    				} else if ("FSPT".equals(tag)) {
+    				} else if ("VRID".equals(tag)) {
+    					name = (Long)S57dat.getSubf(record, fields+pos, S57field.VRID, S57subf.RCNM);
+    					switch ((int)name) {
+    					case 110:
+    						nflag = Nflag.ISOL;
+    						break;
+    					case 120:
+    						nflag = Nflag.CONN;
+    						break;
+    					default:
+    						nflag = Nflag.ANON;
+    						break;
+    					}
+    					name <<= 32;
+    					name += (Long)S57dat.getSubf(record, fields+pos, S57field.VRID, S57subf.RCID);
+    					name <<= 16;
+    					if (nflag == Nflag.ANON) {
+    						map.newEdge(name);
+    					}
+    				} else if ("ATTV".equals(tag)) {
+    				} else if ("VRPC".equals(tag)) {
+    				} else if ("VRPT".equals(tag)) {
+    					name = (Long)S57dat.getSubf(record, fields+pos, S57field.VRPT, S57subf.NAME) << 16;
+    					int topi = ((Long)S57dat.getSubf(S57subf.TOPI)).intValue();
+    					map.addConn(name, topi);
+    					name = (Long)S57dat.getSubf(S57subf.NAME) << 16;
+    					topi = ((Long)S57dat.getSubf(S57subf.TOPI)).intValue();
+    					map.addConn(name, topi);
+    				} else if ("SGCC".equals(tag)) {
+    				} else if ("SG2D".equals(tag)) {
+    					S57dat.setField(record, fields + pos, S57field.SG2D, len);
+    					while (S57dat.more()) {
+    						double lat = (double) ((Long) S57dat.getSubf(S57subf.YCOO)) / comf;
+    						double lon = (double) ((Long) S57dat.getSubf(S57subf.XCOO)) / comf;
+    						if (nflag == Nflag.ANON) {
+    							map.newNode(++name, lat, lon, nflag);
+    						} else {
+    							map.newNode(name, lat, lon, nflag);
+    						}
+    						if (lat < minlat) minlat = lat;
+    						if (lat > maxlat) maxlat = lat;
+    						if (lon < minlon) minlon = lon;
+    						if (lon > maxlon) maxlon = lon;
+    					}
+    				} else if ("SG3D".equals(tag)) {
+    					S57dat.setField(record, fields + pos, S57field.SG3D, len);
+    					while (S57dat.more()) {
+    						double lat = (double) ((Long) S57dat.getSubf(S57subf.YCOO)) / comf;
+    						double lon = (double) ((Long) S57dat.getSubf(S57subf.XCOO)) / comf;
+    						double depth = (double) ((Long) S57dat.getSubf(S57subf.VE3D)) / somf;
+    						map.newNode(name++, lat, lon, depth);
+    						if (lat < minlat) minlat = lat;
+    						if (lat > maxlat) maxlat = lat;
+    						if (lon < minlon) minlon = lon;
+    						if (lon > maxlon) maxlon = lon;
+    					}
+    				}
+				}
+			}
+		}
+		in.close();
+		
+		out.println("<?xml version='1.0' encoding='UTF-8'?>");
+		out.println("<osm version='0.6' generator='js57toosm'>");
+		out.println("<bounds minlat='" + minlat +"' minlon='" + minlon + "' maxlat='" + maxlat + "' maxlon='" + maxlon + "'/>");
+		
+		for (long id : map.nodes.keySet()) {
+			Snode node = map.nodes.get(id);
+			if (node.flg == S57map.Nflag.DPTH) {
+				out.format("  <node id='%d' lat='%f' lon='%f' version='1'>%n", -id, Math.toDegrees(node.lat), Math.toDegrees(node.lon));
+				out.format("    <tag k='seamark:type' v='sounding'/>%n");
+				out.format("    <tag k='seamark:sounding:depth' v='%.1f'/>%n", ((Dnode)node).val);
+				out.format("  </node>%n");
+			} else {
+				out.format("  <node id='%d' lat='%f' lon='%f' version='1'/>%n",-id,  Math.toDegrees(node.lat), Math.toDegrees(node.lon));
+			}
+		}
+		
+		for (long id : map.edges.keySet()) {
+			Edge edge = map.edges.get(id);
+			out.format("  <way id='%d' version='1'>%n", -id);
+			out.format("    <nd ref='%d'/>%n", -edge.first);
+			for (long anon : edge.nodes) {
+				out.format("    <nd ref='%d'/>%n", -anon);
+			}
+			out.format("    <nd ref='%d'/>%n", -edge.last);
+			out.format("  </way>%n");
+		}
+		
+		out.println("</osm>\n");
+	}
+
+}
Index: /applications/editors/josm/plugins/smed2/js57toosm/src/s57
===================================================================
--- /applications/editors/josm/plugins/smed2/js57toosm/src/s57	(revision 30188)
+++ /applications/editors/josm/plugins/smed2/js57toosm/src/s57	(revision 30188)
@@ -0,0 +1,1 @@
+link ../../src/s57
Index: plications/editors/josm/plugins/smed2/src/s57/Js57toosm.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/s57/Js57toosm.java	(revision 30187)
+++ 	(revision )
@@ -1,170 +1,0 @@
-/* Copyright 2013 Malcolm Herring
- *
- * This is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, version 3 of the License.
- *
- * For a copy of the GNU General Public License, see <http://www.gnu.org/licenses/>.
- */
-
-package s57;
-
-import java.io.*;
-
-import s57.S57map.*;
-import s57.S57dat.*;
-
-public class Js57toosm {
-	
-	public static int rnum = 0;
-
-	public static void main(String[] args) throws IOException {
-
-		FileInputStream in = new FileInputStream("/Users/mherring/boatsw/oseam/josm/plugins/smed2/js57toosm/tst.000");
-		PrintStream out = System.out;
-
-		byte[] leader = new byte[24];
-		boolean ddr = false;
-		int length;
-		int fields;
-		int mapfl, mapfp, mapts, entry;
-		String tag;
-		int len;
-		int pos;
-		
-		double comf = 1;
-		double somf = 1;
-		long name = 0;
-		S57map.Nflag nflag = Nflag.ANON;
-		S57map map = new S57map();
-		double minlat = 90, minlon = 180, maxlat = -90, maxlon = -180;
-
-		while (in.read(leader) == 24) {
-			length = Integer.parseInt(new String(leader, 0, 5)) - 24;
-			ddr = (leader[6] == 'L');
-			fields = Integer.parseInt(new String(leader, 12, 5)) - 24;
-			mapfl = leader[20] - '0';
-			mapfp = leader[21] - '0';
-			mapts = leader[23] - '0';
-			entry = mapfl + mapfp + mapts;
-			byte[] record = new byte[length];
-			if (in.read(record) != length)
-				break;
-			for (int idx = 0; idx < fields-1; idx += entry) {
-				tag = new String(record, idx, mapts);
-				len = Integer.parseInt(new String(record, idx+mapts, mapfl));
-				pos = Integer.parseInt(new String(record, idx+mapts+mapfl, mapfp));
-				if (!ddr) {
-    				if ("0001".equals(tag)) {
-    					int i8rn = ((Long)S57dat.getSubf(record, fields+pos, S57field.I8RI, S57subf.I8RN)).intValue();
-    					if (i8rn != ++rnum) {
-    						out.println("Out of order record ID");
-    						in.close();
-    						System.exit(-1);
-    					}
-    				} else if ("DSID".equals(tag)) {
-    				} else if ("DSSI".equals(tag)) {
-    				} else if ("DSPM".equals(tag)) {
-    					comf = (double)(Long)S57dat.getSubf(record, fields+pos, S57field.DSPM, S57subf.COMF);
-    					somf = (double)(Long)S57dat.getSubf(S57subf.SOMF);
-    				} else if ("FRID".equals(tag)) {
-    				} else if ("FOID".equals(tag)) {
-    				} else if ("ATTF".equals(tag)) {
-    				} else if ("NATF".equals(tag)) {
-    				} else if ("FFPC".equals(tag)) {
-    				} else if ("FFPT".equals(tag)) {
-    				} else if ("FSPC".equals(tag)) {
-    				} else if ("FSPT".equals(tag)) {
-    				} else if ("VRID".equals(tag)) {
-    					name = (Long)S57dat.getSubf(record, fields+pos, S57field.VRID, S57subf.RCNM);
-    					switch ((int)name) {
-    					case 110:
-    						nflag = Nflag.ISOL;
-    						break;
-    					case 120:
-    						nflag = Nflag.CONN;
-    						break;
-    					default:
-    						nflag = Nflag.ANON;
-    						break;
-    					}
-    					name <<= 32;
-    					name += (Long)S57dat.getSubf(record, fields+pos, S57field.VRID, S57subf.RCID);
-    					name <<= 16;
-    					if (nflag == Nflag.ANON) {
-    						map.newEdge(name);
-    					}
-    				} else if ("ATTV".equals(tag)) {
-    				} else if ("VRPC".equals(tag)) {
-    				} else if ("VRPT".equals(tag)) {
-    					name = (Long)S57dat.getSubf(record, fields+pos, S57field.VRPT, S57subf.NAME) << 16;
-    					int topi = ((Long)S57dat.getSubf(S57subf.TOPI)).intValue();
-    					map.addConn(name, topi);
-    					name = (Long)S57dat.getSubf(S57subf.NAME) << 16;
-    					topi = ((Long)S57dat.getSubf(S57subf.TOPI)).intValue();
-    					map.addConn(name, topi);
-    				} else if ("SGCC".equals(tag)) {
-    				} else if ("SG2D".equals(tag)) {
-    					S57dat.setField(record, fields + pos, S57field.SG2D, len);
-    					while (S57dat.more()) {
-    						double lat = (double) ((Long) S57dat.getSubf(S57subf.YCOO)) / comf;
-    						double lon = (double) ((Long) S57dat.getSubf(S57subf.XCOO)) / comf;
-    						if (nflag == Nflag.ANON) {
-    							map.newNode(++name, lat, lon, nflag);
-    						} else {
-    							map.newNode(name, lat, lon, nflag);
-    						}
-    						if (lat < minlat) minlat = lat;
-    						if (lat > maxlat) maxlat = lat;
-    						if (lon < minlon) minlon = lon;
-    						if (lon > maxlon) maxlon = lon;
-    					}
-    				} else if ("SG3D".equals(tag)) {
-    					S57dat.setField(record, fields + pos, S57field.SG3D, len);
-    					while (S57dat.more()) {
-    						double lat = (double) ((Long) S57dat.getSubf(S57subf.YCOO)) / comf;
-    						double lon = (double) ((Long) S57dat.getSubf(S57subf.XCOO)) / comf;
-    						double depth = (double) ((Long) S57dat.getSubf(S57subf.VE3D)) / somf;
-    						map.newNode(name++, lat, lon, depth);
-    						if (lat < minlat) minlat = lat;
-    						if (lat > maxlat) maxlat = lat;
-    						if (lon < minlon) minlon = lon;
-    						if (lon > maxlon) maxlon = lon;
-    					}
-    				}
-				}
-			}
-		}
-		in.close();
-		
-		out.println("<?xml version='1.0' encoding='UTF-8'?>");
-		out.println("<osm version='0.6' generator='js57toosm'>");
-		out.println("<bounds minlat='" + minlat +"' minlon='" + minlon + "' maxlat='" + maxlat + "' maxlon='" + maxlon + "'/>");
-		
-		for (long id : map.nodes.keySet()) {
-			Snode node = map.nodes.get(id);
-			if (node.flg == S57map.Nflag.DPTH) {
-				out.format("  <node id='%d' lat='%f' lon='%f' version='1'>%n", -id, Math.toDegrees(node.lat), Math.toDegrees(node.lon));
-				out.format("    <tag k='seamark:type' v='sounding'/>%n");
-				out.format("    <tag k='seamark:sounding:depth' v='%.1f'/>%n", ((Dnode)node).val);
-				out.format("  </node>%n");
-			} else {
-				out.format("  <node id='%d' lat='%f' lon='%f' version='1'/>%n",-id,  Math.toDegrees(node.lat), Math.toDegrees(node.lon));
-			}
-		}
-		
-		for (long id : map.edges.keySet()) {
-			Edge edge = map.edges.get(id);
-			out.format("  <way id='%d' version='1'>%n", -id);
-			out.format("    <nd ref='%d'/>%n", -edge.first);
-			for (long anon : edge.nodes) {
-				out.format("    <nd ref='%d'/>%n", -anon);
-			}
-			out.format("    <nd ref='%d'/>%n", -edge.last);
-			out.format("  </way>%n");
-		}
-		
-		out.println("</osm>\n");
-	}
-
-}
Index: /applications/editors/josm/plugins/smed2/src/s57/S57dat.java
===================================================================
--- /applications/editors/josm/plugins/smed2/src/s57/S57dat.java	(revision 30187)
+++ /applications/editors/josm/plugins/smed2/src/s57/S57dat.java	(revision 30188)
@@ -138,4 +138,5 @@
 	private static int index;
 	private static S57field field;
+	public static int rnum;
 	
 	public static void setField(byte[] buf, int off, S57field fld, int len) {
@@ -173,5 +174,5 @@
 					wrap = true;
 				} else {
-					System.out.println("ERROR: Subfield not found " + subf.name() + " in " + field.name() + " in record " + Js57toosm.rnum);
+					System.out.println("ERROR: Subfield not found " + subf.name() + " in " + field.name() + " in record " + rnum);
 					System.exit(-1);
 				}
