/// <summary> /// Formats a single-character operand. Output will be a delimited printable character /// when possible, a hex value when the converted character is unprintable. /// </summary> /// <param name="value">Value to format. Could be a 16-bit immediate value.</param> /// <param name="enc">Character encoding to use for value.</param> /// <returns>Formatted string.</returns> public string FormatCharacterValue(int value, CharEncoding.Encoding enc) { if (value < 0 || value > 0xff) { return(FormatHexValue(value, 2)); } DelimiterDef delimDef = mFormatConfig.mCharDelimiters.Get(enc); if (delimDef == null) { return(FormatHexValue(value, 2)); } string fmt = delimDef.FormatStr; Debug.Assert(fmt != null); CharEncoding.Convert conv; switch (enc) { case CharEncoding.Encoding.Ascii: conv = CharEncoding.ConvertAscii; break; case CharEncoding.Encoding.HighAscii: conv = CharEncoding.ConvertHighAscii; break; case CharEncoding.Encoding.C64Petscii: conv = CharEncoding.ConvertC64Petscii; break; case CharEncoding.Encoding.C64ScreenCode: conv = CharEncoding.ConvertC64ScreenCode; break; default: return(FormatHexValue(value, 2)); } char ch = conv((byte)value); if (ch == CharEncoding.UNPRINTABLE_CHAR || ch == delimDef.OpenDelim || ch == delimDef.CloseDelim) { // We might be able to do better with delimiter clashes, e.g. '\'', but // that's assembler-specific. return(FormatHexValue(value, 2)); } else { // Possible optimization: replace fmt with a prefix/suffix pair, and just concat return(string.Format(fmt, ch)); } }
public void Set(CharEncoding.Encoding enc, DelimiterDef def) { mDelimiters[enc] = def; }