Exemplo n.º 1
0
        /// <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));
            }
        }
Exemplo n.º 2
0
 public void Set(CharEncoding.Encoding enc, DelimiterDef def)
 {
     mDelimiters[enc] = def;
 }