1 32 package net.sf.retrotranslator.runtime.format; 33 34 import java.math.BigInteger ; 35 36 39 abstract class NondecimalIntegralConversion extends NumericConversion { 40 41 public void format(FormatContext context) { 42 context.checkWidth(); 43 context.assertNoPrecision(); 44 context.assertNoFlag(','); 45 context.checkFlags(); 46 Object argument = context.getArgument(); 47 if (argument instanceof Byte ) { 48 printf(context, (Byte ) argument, Byte.SIZE); 49 } else if (argument instanceof Short ) { 50 printf(context, (Short ) argument, Short.SIZE); 51 } else if (argument instanceof Integer ) { 52 printf(context, (Integer ) argument, Integer.SIZE); 53 } else if (argument instanceof Long ) { 54 printf(context, (Long ) argument, Long.SIZE); 55 } else if (argument instanceof BigInteger ) { 56 printf(context, (BigInteger ) argument); 57 } else if (argument == null) { 58 context.writePadded(String.valueOf(argument)); 59 } else { 60 throw context.getConversionException(); 61 } 62 } 63 64 private void printf(FormatContext context, long argument, int size) { 65 context.assertNoFlag('('); 66 context.assertNoFlag(' '); 67 context.assertNoFlag('+'); 68 long value = argument >= 0 || size == Long.SIZE ? argument : argument + (1L << size); 69 printf(context, false, toUnsignedString(value)); 70 } 71 72 private void printf(FormatContext context, BigInteger argument) { 73 printf(context, argument.signum() < 0, toSignedString(argument.abs())); 74 } 75 76 private void printf(FormatContext context, boolean negative, String value) { 77 String prefix = context.isFlag('#') ? getRadixIndicator() : null; 78 printNumber(context, negative, prefix, new StringBuilder (value), context.getSymbols(false)); 79 } 80 81 protected abstract String getRadixIndicator(); 82 83 protected abstract String toUnsignedString(long value); 84 85 protected abstract String toSignedString(BigInteger value); 86 87 public static class OctalConversion extends NondecimalIntegralConversion { 88 89 protected String getRadixIndicator() { 90 return "0"; 91 } 92 93 protected String toUnsignedString(long value) { 94 return Long.toOctalString(value); 95 } 96 97 protected String toSignedString(BigInteger value) { 98 return value.toString(8); 99 } 100 } 101 102 public static class HexadecimalConversion extends NondecimalIntegralConversion { 103 104 protected String getRadixIndicator() { 105 return "0x"; 106 } 107 108 protected String toUnsignedString(long value) { 109 return Long.toHexString(value); 110 } 111 112 protected String toSignedString(BigInteger value) { 113 return value.toString(16); 114 } 115 } 116 117 } 118 | Popular Tags |