protected virtual StringBuffer ExtractKey(StringBuffer fullString)
        {
            var key = new StringBuffer();

            while (fullString.Count > 0 && fullString.PeekStart() != ':')
            {
                key.PushToEnd(fullString.PopFromStart());
            }

            fullString.PopFromStart(); // Skip : separator

            return(key);
        }
        protected override string ExtractValue(StringBuffer fullString)
        {
            string serialValues = $"{SpChar_BeginComplexValue}";

            int openParens = 0;

            var buffer = new StringBuffer();

            do
            {
                switch (fullString.PeekStart())
                {
                case SpChar_ValueDelimiter when openParens == 0:                           // End of ComplexList
                case SpChar_ListItemSplitter when openParens == 0 && fullString.Count > 0: // End of a nested property belonging to this collection
                    fullString.PopFromStart();                                             // Skip delimiter

                    var collection = (ListedType)Template.Copy();
                    collection.FromString($"{this.Key}{SpChar_KeyDelimiter}{buffer.ToString()}{SpChar_ValueDelimiter}");
                    this.Values.Add(collection);
                    buffer.Clear();
                    serialValues += $"{collection.SerializedValue}{SpChar_ListItemSplitter}";
                    break;

                case SpChar_BeginComplexValue:
                    openParens++;
                    goto default;

                case SpChar_FinishComplexValue:
                    openParens--;
                    if (openParens < 0)
                    {
                        throw new EmException(UnbalancedContainersError, buffer);
                    }
                    goto default;

                default:
                    buffer.PushToEnd(fullString.PopFromStart());
                    break;
                }
            } while (fullString.Count > 0);

            if (openParens != 0)
            {
                throw new EmException(UnbalancedContainersError, buffer);
            }

            return(serialValues.TrimEnd(SpChar_ListItemSplitter) + SpChar_FinishComplexValue);
        }
Example #3
0
 public void TransferToEnd(StringBuffer valuesToTransfer)
 {
     while (!valuesToTransfer.IsEmpty)
     {
         PushToEnd(valuesToTransfer.PopFromStart());
     }
 }
        private static StringBuffer CleanValue(StringBuffer rawValue, bool stopAtKey = false)
        {
            var cleanValue = new StringBuffer();

            while (!rawValue.IsEmpty)
            {
                switch (rawValue.PeekStart())
                {
                case ' ':     // spaces
                    rawValue.TrimStart(' ');
                    break;

                case '\t':     // tabs
                    rawValue.TrimStart('\t');
                    break;

                case '\r':     // line breaks
                case '\n':
                    rawValue.TrimStart('\r', '\n');
                    break;

                case SpChar_CommentBlock:     // comments
                    rawValue.PopFromStart();  // Pop first #

                    char poppedChar;
                    do
                    {
                        poppedChar = rawValue.PopFromStart();
                    } while (!rawValue.IsEmpty && poppedChar != SpChar_CommentBlock);

                    break;

                case SpChar_KeyDelimiter when stopAtKey:
                    return(cleanValue);

                case SpChar_LiteralStringBlock:
                    cleanValue.PushToEnd(rawValue.PopFromStart());     // Add first "

                    char popped;
                    do
                    {
                        popped = rawValue.PopFromStart();
                        cleanValue.PushToEnd(popped);
                    } while (popped != SpChar_LiteralStringBlock);

                    break;

                case SpChar_EscapeChar:
                    cleanValue.PushToEnd(rawValue.PopFromStart());     // Pop escape char
                    cleanValue.PushToEnd(rawValue.PopFromStart());     // Add escaped char
                    break;

                default:
                    cleanValue.PushToEnd(rawValue.PopFromStart());
                    break;
                }
            }

            return(cleanValue);
        }
        internal static string ReadUntilDelimiter(StringBuffer fullString, ICollection <char> delimeters)
        {
            var  value = new StringBuffer();
            char nextChar;

            while (!fullString.IsEmpty && !delimeters.Contains(nextChar = fullString.PeekStart()))
            {
                if (nextChar == SpChar_EscapeChar)
                {
                    fullString.PopFromStart();                  // Skip the escape char.
                    value.PushToEnd(fullString.PopFromStart()); // Allow the escaped char into the value.
                }
                else if (nextChar == SpChar_LiteralStringBlock)
                {
                    fullString.PopFromStart(); // Skip the escape char.
                    while (!fullString.IsEmpty && (nextChar = fullString.PopFromStart()) != SpChar_LiteralStringBlock)
                    {
                        value.PushToEnd(nextChar); // Grab everything contained between the " chars except the " chars
                    }
                }
                else
                {
                    value.PushToEnd(fullString.PopFromStart()); // Basic case
                }
            }

            fullString.PopFromStart(); // Skip delimeter

            return(value.ToString());
        }
Example #6
0
        public void Replace(char[] original, char[] replacement)
        {
            if (IsEmpty)
            {
                return;
            }


            var finalValue = new StringBuffer(this.Count);
            var limbo      = new StringBuffer(this.Count);

            int cIndex = 0;

            int oCount = original.Length;

            do
            {
                if (this.PeekStart() == original[cIndex])
                {
                    limbo.PushToEnd(this.PopFromStart());
                    cIndex++;

                    if (cIndex == oCount) // Full match
                    {
                        foreach (char c in replacement)
                        {
                            finalValue.PushToEnd(c);
                        }

                        limbo.Clear();
                        cIndex = 0;
                    }
                }
                else
                {
                    cIndex = 0;

                    while (!limbo.IsEmpty)
                    {
                        finalValue.PushToEnd(limbo.PopFromStart());
                    }

                    finalValue.PushToEnd(this.PopFromStart());
                }
            } while (!this.IsEmpty);

            do
            {
                this.PushToEnd(finalValue.PopFromStart());
            } while (!finalValue.IsEmpty);
        }
        internal static string EscapeSpecialCharacters(string unescapedValue)
        {
            if (string.IsNullOrEmpty(unescapedValue))
            {
                return(string.Empty);
            }

            var original = new StringBuffer(unescapedValue);
            var escaped  = new StringBuffer();

            if (original.Contains(' '))
            {
                escaped.PushToEnd(SpChar_LiteralStringBlock);
                escaped.TransferToEnd(original);
                escaped.PushToEnd(SpChar_LiteralStringBlock);
            }
            else
            {
                while (!original.IsEmpty)
                {
                    switch (original.PeekStart())
                    {
                    case SpChar_KeyDelimiter:
                    case SpChar_ValueDelimiter:
                    case SpChar_BeginComplexValue:
                    case SpChar_FinishComplexValue:
                    case SpChar_ListItemSplitter:
                    case SpChar_CommentBlock:
                    case SpChar_EscapeChar:
                        escaped.PushToEnd(SpChar_EscapeChar);
                        break;

                    default:
                        break;
                    }

                    escaped.PushToEnd(original.PopFromStart());
                }
            }

            return(escaped.ToString());
        }
        public string PrettyPrint()
        {
            string originalValue = ToString();

            if (string.IsNullOrEmpty(originalValue))
            {
                return(string.Empty);
            }

            var originalString = new StringBuffer(originalValue);

            var prettyString = new StringBuffer();

            int       indentLevel = 0;
            const int indentSize  = 4;

            do
            {
                switch (originalString.PeekStart())
                {
                case SpChar_BeginComplexValue:
                    prettyString.PushToEnd('\r', '\n');
                    prettyString.PushToEnd(' ', indentLevel * indentSize);
                    indentLevel++;
                    prettyString.PushToEnd(originalString.PopFromStart());
                    prettyString.PushToEnd('\r', '\n');
                    prettyString.PushToEnd(' ', indentLevel * indentSize);
                    prettyString.PushToEnd(originalString.PopFromStart());
                    break;

                case SpChar_ValueDelimiter:
                    prettyString.PushToEnd(originalString.PopFromStart());

                    if (originalString.IsEmpty || originalString.PeekStart() == SpChar_FinishComplexValue)
                    {
                        indentLevel--;
                    }

                    prettyString.PushToEnd('\r', '\n');
                    prettyString.PushToEnd(' ', indentLevel * indentSize);

                    break;

                case SpChar_CommentBlock:
                    prettyString.PushToEnd(originalString.PopFromStart());

                    do
                    {
                        prettyString.PushToEnd(originalString.PopFromStart());
                    } while (!originalString.IsEmpty && prettyString.PeekEnd() != SpChar_CommentBlock);

                    prettyString.PushToEnd('\r', '\n');
                    prettyString.PushToEnd(' ', indentLevel * indentSize);
                    break;

                case SpChar_KeyDelimiter:
                    prettyString.PushToEnd(originalString.PopFromStart());
                    prettyString.PushToEnd(' ');     // Add a space after every KeyDelilmiter
                    break;

                default:
                    prettyString.PushToEnd(originalString.PopFromStart());
                    break;
                }
            } while (!originalString.IsEmpty);

            return(prettyString.ToString());
        }