Exemplo n.º 1
0
		static public 	Hashtable		ParseKeywords(string str, Tokens tokens)
		{
			PARSE state			            = PARSE.Initial;
			int index			            = 0;
			int keyStart		            = 0;
			InsensitiveHashtable keywords  = new InsensitiveHashtable(5);
			string key			            = null;

			if(str != null)
			{
				StringBuilder builder = new StringBuilder(str.Length);
				for(; index < str.Length; index ++)
				{
					char ch = str[index];
					switch(state)
					{
						case PARSE.Initial:
							if(Char.IsLetterOrDigit(ch))
							{
								keyStart = index;
								state    = PARSE.Keyword;
							}
							break;

						case PARSE.Keyword:
                            if(tokens.Seperator.IndexOf(ch) >= 0)
                            {
                                state = PARSE.Initial;
                            }
                            else if(tokens.Equal.IndexOf(ch) >= 0)
							{
								//Note: We have a case-insentive hashtable so we don't have to lowercase
								key = str.Substring(keyStart, index - keyStart).Trim();
								state = PARSE.Equal;
 							}
							break;

						case PARSE.Equal:
							if(Char.IsWhiteSpace(ch))
								break;
							builder.Length = 0;
							
							//Note: Since we allow you to alter the tokens, these are not 
							//constant values, so we cannot use a switch statement...
							if(tokens.SingleQuote.IndexOf(ch) >= 0)
							{
								state = PARSE.SingleBegin;
							}
							else if(tokens.DoubleQuote.IndexOf(ch) >= 0)
							{
								state = PARSE.DoubleBegin;
							}
							else if(tokens.Seperator.IndexOf(ch) >= 0)
							{
								keywords.Update(key, String.Empty);
								state = PARSE.Initial;
							}
							else
							{
								state = PARSE.Value;
								builder.Append(ch);
							}
							break;

						case PARSE.Value:
							if(tokens.Seperator.IndexOf(ch) >= 0)
							{
								keywords.Update(key, (builder.ToString()).Trim());
								state = PARSE.Initial;
							}
							else
							{
								builder.Append(ch);
							}
							break;

						case PARSE.SingleBegin:
							if(tokens.SingleQuote.IndexOf(ch) >= 0)
								state = PARSE.SingleEnd;
							else
								builder.Append(ch);
							break;

						case PARSE.DoubleBegin:
							if(tokens.DoubleQuote.IndexOf(ch) >= 0)
								state = PARSE.DoubleEnd;
							else
								builder.Append(ch);
							break;

						case PARSE.SingleEnd:
							if(tokens.SingleQuote.IndexOf(ch) >= 0)
							{
								state = PARSE.SingleBegin;
								builder.Append(ch);
							}
							else
							{
								keywords.Update(key, builder.ToString());
								state = PARSE.End;
								goto case PARSE.End;
							}
							break;

						case PARSE.DoubleEnd:
							if(tokens.DoubleQuote.IndexOf(ch) >= 0)
							{
								state = PARSE.DoubleBegin;
								builder.Append(ch);
							}
							else
							{
								keywords.Update(key, builder.ToString());
								state = PARSE.End;
								goto case PARSE.End;
							}
							break;

						case PARSE.End:
							if(tokens.Seperator.IndexOf(ch) >= 0)
							{
								state = PARSE.Initial;
							}
							break;

						default:
							throw new TestFailedException("Unhandled State: " + StringEx.ToString(state));
					}
				}

				switch(state)
				{
					case PARSE.Initial:
					case PARSE.Keyword:
					case PARSE.End:
						break;

					case PARSE.Equal:
						keywords.Update(key, String.Empty);
						break;
					
					case PARSE.Value:
						keywords.Update(key, (builder.ToString()).Trim());
						break;
					
					case PARSE.SingleBegin:
					case PARSE.DoubleBegin:
					case PARSE.SingleEnd:
					case PARSE.DoubleEnd:
						keywords.Update(key, builder.ToString());
						break;

					default:
						throw new TestFailedException("Unhandled State: " + StringEx.ToString(state));
				};
			}
			return keywords;
		}	
Exemplo n.º 2
0
        static public Hashtable               ParseKeywords(string str, Tokens tokens)
        {
            PARSE state    = PARSE.Initial;
            int   index    = 0;
            int   keyStart = 0;
            InsensitiveHashtable keywords = new InsensitiveHashtable(5);
            string key = null;

            if (str != null)
            {
                StringBuilder builder = new StringBuilder(str.Length);
                for (; index < str.Length; index++)
                {
                    char ch = str[index];
                    switch (state)
                    {
                    case PARSE.Initial:
                        if (Char.IsLetterOrDigit(ch))
                        {
                            keyStart = index;
                            state    = PARSE.Keyword;
                        }
                        break;

                    case PARSE.Keyword:
                        if (tokens.Seperator.IndexOf(ch) >= 0)
                        {
                            state = PARSE.Initial;
                        }
                        else if (tokens.Equal.IndexOf(ch) >= 0)
                        {
                            //Note: We have a case-insentive hashtable so we don't have to lowercase
                            key   = str.Substring(keyStart, index - keyStart).Trim();
                            state = PARSE.Equal;
                        }
                        break;

                    case PARSE.Equal:
                        if (Char.IsWhiteSpace(ch))
                        {
                            break;
                        }
                        builder.Length = 0;

                        //Note: Since we allow you to alter the tokens, these are not
                        //constant values, so we cannot use a switch statement...
                        if (tokens.SingleQuote.IndexOf(ch) >= 0)
                        {
                            state = PARSE.SingleBegin;
                        }
                        else if (tokens.DoubleQuote.IndexOf(ch) >= 0)
                        {
                            state = PARSE.DoubleBegin;
                        }
                        else if (tokens.Seperator.IndexOf(ch) >= 0)
                        {
                            keywords.Update(key, String.Empty);
                            state = PARSE.Initial;
                        }
                        else
                        {
                            state = PARSE.Value;
                            builder.Append(ch);
                        }
                        break;

                    case PARSE.Value:
                        if (tokens.Seperator.IndexOf(ch) >= 0)
                        {
                            keywords.Update(key, (builder.ToString()).Trim());
                            state = PARSE.Initial;
                        }
                        else
                        {
                            builder.Append(ch);
                        }
                        break;

                    case PARSE.SingleBegin:
                        if (tokens.SingleQuote.IndexOf(ch) >= 0)
                        {
                            state = PARSE.SingleEnd;
                        }
                        else
                        {
                            builder.Append(ch);
                        }
                        break;

                    case PARSE.DoubleBegin:
                        if (tokens.DoubleQuote.IndexOf(ch) >= 0)
                        {
                            state = PARSE.DoubleEnd;
                        }
                        else
                        {
                            builder.Append(ch);
                        }
                        break;

                    case PARSE.SingleEnd:
                        if (tokens.SingleQuote.IndexOf(ch) >= 0)
                        {
                            state = PARSE.SingleBegin;
                            builder.Append(ch);
                        }
                        else
                        {
                            keywords.Update(key, builder.ToString());
                            state = PARSE.End;
                            goto case PARSE.End;
                        }
                        break;

                    case PARSE.DoubleEnd:
                        if (tokens.DoubleQuote.IndexOf(ch) >= 0)
                        {
                            state = PARSE.DoubleBegin;
                            builder.Append(ch);
                        }
                        else
                        {
                            keywords.Update(key, builder.ToString());
                            state = PARSE.End;
                            goto case PARSE.End;
                        }
                        break;

                    case PARSE.End:
                        if (tokens.Seperator.IndexOf(ch) >= 0)
                        {
                            state = PARSE.Initial;
                        }
                        break;

                    default:
                        throw new TestFailedException("Unhandled State: " + StringEx.ToString(state));
                    }
                }

                switch (state)
                {
                case PARSE.Initial:
                case PARSE.Keyword:
                case PARSE.End:
                    break;

                case PARSE.Equal:
                    keywords.Update(key, String.Empty);
                    break;

                case PARSE.Value:
                    keywords.Update(key, (builder.ToString()).Trim());
                    break;

                case PARSE.SingleBegin:
                case PARSE.DoubleBegin:
                case PARSE.SingleEnd:
                case PARSE.DoubleEnd:
                    keywords.Update(key, builder.ToString());
                    break;

                default:
                    throw new TestFailedException("Unhandled State: " + StringEx.ToString(state));
                }
                ;
            }
            return(keywords);
        }