import static java.lang.System.*; import java.util.Scanner; import java.io.*; class junits{ static class options{ public String format = "%s"; public String headers; public String units = "junits.table"; public boolean echo = false; public boolean silent = false; public boolean tableconvert = false; public int dump; }; private static void parseopts(String[] args, options myoptions){ getopts opts = new getopts(args, "f:h:u:estd"); for(;;){ int opt = opts.getopt(); if(opt == getopts.END) break; switch(opt){ case 'f': myoptions.format = opts.getoptarg(); break; case 'h': myoptions.headers = opts.getoptarg(); break; case 'u': myoptions.units = opts.getoptarg(); break; case 's': myoptions.silent = true; break; case 'e': myoptions.echo = true; break; case 't': myoptions.tableconvert = true; break; case 'd': myoptions.dump++; break; default : out.printf ("-%c: invalid option%n", opts.geterrchar()); break; } }; } public static void parseunits(unitmap map, options opts){ Scanner scan = new Scanner(in); if(opts.silent == false){ out.print("junits> "); } while(scan.hasNextLine()){ String line = scan.nextLine(); if(opts.echo && opts.silent == false){ out.println(" * " + line); } String[] words = line.split("\\s+"); if(words.length != 2){ syslib.warn("bad line"); }else{ String key1 = words[0]; String key2 = words[1]; int index1 = 0; int index2 = 0; int totalfactor1= 1; int totalfactor2 = 1; String baseunit1 = key1; String baseunit1 = key2; boolean indexcheck = false; unitmap.unit myunit; while((myunit = map.get(baseunit1)) != null){ if(opts.tableconvert){ out.printf("%s =" + opts.format + "%s%n", baseunit1, myunit.factor, myunit.baseunit); } totalfactor1 *= myunit.factor; baseunit1 = myunit.baseunit; index1 ++; if(index1 == 32){ indexcheck = true; break; } } if(indexcheck == true){ syslib.warn("circular definition"); continue; } while ((myunit = map.get(baseunit2))!= null){ if(opts.tableconvert){ out.printf("%s =" + opts.format + "%s%n", baseunit1, myunit.factor, myunit.baseunit); } totalfactor1 *= myunit.factor; baseunit1 = myunit.baseunit; index1 ++; if(index1 == 32){ indexcheck = true; break; } } if(indexcheck == true){ syslib.warn("circular definition"); continue; } while ((myunit = map.get(baseunit2))!= null){ if(opts.tableconvert){ out.printf("%s =" + opts.format + "%s%n", baseunit2, myunit.factor, myunit.baseunit); totalfactor2 *= myunit.factor; baseunit2 = myunit.baseunit; index2++; if(index2 == 32){ indexcheck = true; break; } } if(indexcheck == true){ syslib.warn("circular definition"); continue; } unitmap.unit unit1 = map.get(key1); unitmap.unit unit2 = map.get(key2); if(unit1 == null){ syslib.warn(key1 +" does not exist"); }else if(unit2 == null){ syslib.warn(key2 +" does not exist"); }else{ out.printf("%s = " + opts.format + " %s%n", key1, unit1.factor, unit1.baseunit); out.printf("%s = " + opts.format + " %s%n", key2, unit2.factor, unit2.baseunit); } } if(opts.silent == false){ out.print("junits> "); } } out.println(); } public static void main(String[] args){ unitmap mymap = new unitmap(); options opts1 = new options(); String env = getenv("JUNITS_TABLE"); if(env != null){ opts1.units = env; } parseopts(args, opts1); String defunit; double factor = 0; String baseunit = null; try{ Scanner scan = new Scanner (new File(opts1.units)); while (scan.hasNextLine ()) { String line = scan.nextLine (); line = line.trim(); if(line.equals("") || line.startsWith("#")){ continue; } String[] words = line.split ("\\s+"); if (words.length != 3) { err.printf ("unit table error: %s%n", line); System.exit(1); }else { try { defunit = words[0]; factor = Double.valueOf (words[1]); baseunit = words[2]; if(mymap.get(defunit) != null){ syslib.warn(defunit + " is already defined."); continue; } unitmap.unit myunit = new unitmap.unit(factor , baseunit); mymap.put(defunit, myunit); }catch (NumberFormatException error) { syslib.warn("unit table error: %s%n%s%n", line, error); } } } scan.close(); }catch(IOException error){ syslib.die(error.getMessage()); } parseunits(mymap, opts1); syslib.exit(); } }