import java.lang.reflect.Field;
import java.util.Comparator;

class FieldComparator implements Comparator {
  public int compare(Object a, Object b) {
    return ((Field)a).getName().compareTo(((Field)b).getName());
  }
  public boolean equals (Object a, Object b) {
    return ((Field)a).getName().equals(((Field)b).getName());
    
  }
}

class Utility {
  
  static Comparator fieldComparator = new FieldComparator();

  static double asNumber (String val) {
    if (val.charAt(0) == 'o') {
      return (double) Long.parseLong(val, 8);
    } else if (val.charAt(0) == 'h') {
      return (double) Long.parseLong(val, 16);
    } else if (val.charAt(0) == 'b') {
      return (double) Long.parseLong(val, 2);
    } else
      return Double.parseDouble(val);
  }

  static boolean asBoolean (String val) {
    val = val.trim();
    if (val.equals("")) return false;
    char c = val.charAt(0);
    if (c == 't' || c == 'T' || c == 'y' || c == 'Y' ||
	c == '1') return true;
    return false;
  }

  static char asChar (String val) {
    if (val.charAt(0) == '\'' || val.charAt(0) == '"') {
      return val.charAt(1);
    } else {
      return (char) asNumber(val);
    }
  }

  static void set(Object o, String sym, String val) {
    Class c = o.getClass();
    try {
      Field f = c.getField(sym);
      Class ft = f.getType();
      String ftn = ft.getName();

      System.err.println("Setting " + sym + " to " + val);

      if (ftn.equals("byte")) {
	f.setByte(o, (byte) asNumber(val));

      } else if (ftn.equals("char")) {
	f.setChar(o, asChar(val));

      } else if (ftn.equals("double")) {
	f.setDouble(o, (double) asNumber(val));

      } else if (ftn.equals("float")) {
	f.setFloat(o, (float) asNumber(val));

      } else if (ftn.equals("int")) {
	f.setInt(o, (int) asNumber(val));

      } else if (ftn.equals("long")) {
	f.setLong(o, (long) asNumber(val));

      } else if (ftn.equals("short")) {
	f.setShort(o, (short) asNumber(val));

      } else if (ftn.equals("boolean")) {
	f.setBoolean(o, asBoolean(val));

      } else if (ftn.equals("java.lang.String")) {
	f.set(o, val);
      } else {
	
      }
    } catch (IllegalAccessException ex) {
      System.err.println("Parameter " + sym + " was found but could not be set because of Java security");
    } catch (NoSuchFieldException ex) {
      System.err.println("Parameter " + sym + " was not found.  One of the following was expected:");
      Field[] f = c.getDeclaredFields();

      java.util.Arrays.sort(f,fieldComparator );

      for (int i = 0; i < f.length; i++) {
	System.err.println(f[i]);
      }
    }
  }
}
