Exemplo n.º 1
0
        internal static void Parse(String fmt, ITarget target)
        {
            int           fmtLength = fmt.Length;
            StringBuilder sb = new StringBuilder(fmtLength);
            bool          literalMode = false, wasQuote = false;

            for (int i = 0; i < fmtLength;)
            {
                char c = fmt[i++];
                if ('\'' == c)
                {
                    literalMode ^= true;
                    if (false == (wasQuote ^= true))
                    {
                        sb.Append('\'');
                    }

                    continue;
                }

                wasQuote = false;
                int maxLen;
                if (!literalMode && (maxLen = target.FieldLength(c)) > 0)
                {
                    int n = i;
                    for (; n < fmtLength && fmt[n] == c; ++n)
                    {
                    }
                    n -= i;
                    i += n++;
                    if (n > maxLen)
                    {
                        char padding = target.PaddingForField(c);
                        for (int j = 0; j < n - maxLen; j++)
                        {
                            sb.Append(padding);
                        }

                        n = maxLen;
                    }

                    if (sb.Length > 0)
                    {
                        target.AddString(sb.ToString());
                        sb.Length = 0;
                    }

                    target.AddField(c, n);
                }
                else
                {
                    sb.Append(c);
                }
            }

            if (sb.Length > 0)
            {
                target.AddString(sb.ToString());
            }
        }