Exemple #1
0
TToken ASNLexer::LookupToken(void)
{
    char c = Char();
    switch ( c ) {
    case ':':
        if ( Char(1) == ':' && Char(2) == '=' ) {
            StartToken();
            AddChars(3);
            return T_DEFINE;
        }
        return T_SYMBOL;
    case '-':
    case '+':
        if ( IsDigit(Char(1)) ) {
            StartToken();
            AddChar();
            return LookupNumber();
        }
        return T_SYMBOL;
    case '\"':
        StartToken();
        AddChar();
        StartString();
        LookupString();
        return T_STRING;
    case '\'':
        StartToken();
        AddChar();
        return LookupBinHexString();
    case '[':
        StartToken();
        AddChar();
        LookupTag();
        return T_TAG;
    default:
        if ( IsDigit(c) ) {
            StartToken();
            AddChar();
            return LookupNumber();
        }
        else if ( c >= 'a' && c <= 'z' ) {
            StartToken();
            AddChar();
            LookupIdentifier();
            return T_IDENTIFIER;
        }
        else if ( c >= 'A' && c <= 'Z' ) {
            StartToken();
            AddChar();
            LookupIdentifier();
            return LookupKeyword();
        }
        return T_SYMBOL;
    }
}
Exemple #2
0
RTFStatus RTFReader::ParseToken(RTFToken& r_token, int4& r_parameter)
{
	RTFStatus t_status;
	t_status = kRTFStatusSuccess;
	
	while(m_input < m_input_end && (*m_input == '\n' || *m_input == '\r'))
		m_input++;
	
	switch(m_input_state)
	{
	case kRTFInputStateNormal:
	{
		// MW-2013-07-31: [[ Bug 10972 ]] Don't use '\0' to indicate end
		//   of RTF, just break directly (Adobe Reader 9 on Mac puts \0 in
		//   font names sometimes causing premature end of RTF parsing).
		if (m_input == m_input_end)
		{
			r_token = kRTFTokenEnd;
			break;
		}
		
		int t_char;
		t_char = *m_input;
		
		switch(t_char)
		{
		case '{':
			r_token = kRTFTokenBeginGroup;
			m_input++;
		break;
		
		case '}':
			r_token = kRTFTokenEndGroup;
			m_input++;
		break;
		
		case '\\':
		{
			m_input++;
			if (m_input == m_input_end)
				t_char = '\0';
			else
				t_char = *m_input;
			
			char t_keyword[32];
			int t_keyword_length;
			t_keyword_length = 0;
			
			char t_parameter[20];
			int t_parameter_length;
			t_parameter_length = 0;
		
			if (t_char == '\0')
			{
				// End of stream in a keyword is an error
				t_status = kRTFStatusIncompleteKeyword;
			}
			else if (t_char == '\'')
			{
				// Handle hex characters here (simplifies skipping)
				m_input++;
				if (m_input == m_input_end)
					t_char = '\0';
				else
					t_char = *m_input;
			
				int t_first_nibble;
				t_status = LookupNibble(t_char, t_first_nibble);
					
				int t_second_nibble;
				if (t_status == kRTFStatusSuccess)
				{
					m_input++;
					if (m_input == m_input_end)
						t_char = '\0';
					else
						t_char = *m_input;
					
					t_status = LookupNibble(t_char, t_second_nibble);
				}
				
				if (t_status == kRTFStatusSuccess)
				{
					m_input++;

					r_token = kRTFTokenCharacter | kRTFTokenHasParameter;
					r_parameter = (t_first_nibble << 4) | t_second_nibble;
				}
			}
			else if (t_char == '{' || t_char == '}' || t_char == '\\')
			{
				m_input++;

				r_token = kRTFTokenCharacter | kRTFTokenHasParameter;
				r_parameter = (uint1)t_char;
			}
			else
			{
				if ((t_char < 'a' || t_char > 'z' ) && (t_char < 'A' || t_char > 'Z'))
				{
					// Any non-letter is a control symbol
					t_keyword[0] = t_char;
					t_keyword_length = 1;
					
					m_input++;
				}
				else
				{
					// We have a letter so parse a control word
					while((t_char >= 'a' && t_char <= 'z') || (t_char >= 'A' && t_char <= 'Z'))
					{
						if (t_char == '\0')
						{
							t_status = kRTFStatusIncompleteKeyword;
							break;
						}
						else if (t_keyword_length == 31)
						{
							t_status = kRTFStatusKeywordTooLong;
							break;
						}
						else
							t_keyword[t_keyword_length++] = t_char;
						
						m_input++;
						if (m_input == m_input_end)
							t_char = '\0';
						else
							t_char = *m_input;
					}
					
					// Now we parse a parameter if the current char is '-' or a digit
					if (t_char == '-' || (t_char >= '0' && t_char <= '9'))
					{
						t_parameter[t_parameter_length++] = t_char;
						
						m_input++;
						if (m_input == m_input_end)
							t_char = '\0';
						else
							t_char = *m_input;
						
						while(t_char >= '0' && t_char <= '9')
						{
							if (t_char == '\0')
							{
								t_status = kRTFStatusIncompleteKeyword;
								break;
							}
							else if (t_parameter_length == 19)
							{
								t_status = kRTFStatusParameterTooLong;
								break;
							}
							else
								t_parameter[t_parameter_length++] = t_char;
								
							m_input++;
							if (m_input == m_input_end)
								t_char = '\0';
							else
								t_char = *m_input;
						}
					}
					
					// Now skip the delimiter if its a space
					if (t_char == ' ')
						m_input++;
				}
				
				if (t_status == kRTFStatusSuccess)
					t_status = LookupKeyword(t_keyword, t_keyword_length, r_token);
				
				if (t_status == kRTFStatusSuccess && t_parameter_length != 0)
				{
					r_token |= kRTFTokenHasParameter;
					r_parameter = StringToInteger(t_parameter, t_parameter_length);
				}
			}
		}
		break;
		
		default:
			m_input++;
			
			r_token = kRTFTokenCharacter | kRTFTokenHasParameter;
			r_parameter = (int)((unsigned char)t_char);
		break;
		}
	}
	break;
	
	case kRTFInputStateBinary:
	{
		int4 t_char;
		if (m_input != m_input_end)
		{
			t_char = *m_input;
			m_input++;
		}
	
		m_input_binary_count -= 1;
		if (m_input_binary_count == 0)
			m_input_state = kRTFInputStateNormal;
			
		r_token = kRTFTokenCharacter | kRTFTokenHasParameter;
		r_parameter = (int)((unsigned char)t_char);
	}
	break;
	
	case kRTFInputStateHex:
	{
		int4 t_char;
		if (m_input != m_input_end)
			t_char = *m_input;
		else
			t_char = '\0';
		m_input++;
	
		int t_first_nibble;
		t_status = LookupNibble(t_char, t_first_nibble);
			
		int t_second_nibble;
		if (t_status == kRTFStatusSuccess)
		{
			if (m_input != m_input_end)
				t_char = *m_input;
			else
				t_char = '\0';
			m_input++;
			
			t_status = LookupNibble(t_char, t_second_nibble);
		}
		
		if (t_status == kRTFStatusSuccess)
		{
			r_token = kRTFTokenCharacter | kRTFTokenHasParameter;
			r_parameter = (t_first_nibble << 4) | t_second_nibble;
			
			m_input_state = kRTFInputStateNormal;
		}
	}
	break;
	}
	
	return t_status;
}
void
HangStruct::ScanState(const char *code, const char *state)
{
    if (code != 0)
    {
        for (int n = 0; code[n] != NULLC; n++)
        {
            if (state[n] == Normal)
            {
                int c = code[n];

                if (isName(c)
                 && (n == 0 || !isName(code[n-1])))
                {
                    char *name = parseKeyword(code, n);
                    int findWord = LookupKeyword(name);

                    TRACE(("lookup '%s' ->%d\n", name, findWord));
                    do_aggreg = False;
                    if (findWord >= 0)
                    {
                        indent = 0;
                        until_parn = 1;
                        if (pIndentWords[findWord].code == oneLine)
                            stmt_level++;
                        else
                            stmt_level = 0;
                    }
                    else
                    {
                        if (!strcmp(name, "enum"))
                            until_curl = 1;

                        if (parn_level == 0)
                            until_parn = 0;
                        indent = 1;
                    }
                    delete[] name;
                }
                else if (!isspace(code[n]))
                {
                    if (do_aggreg && code[n] != L_CURL)
                        do_aggreg = False;

                    switch (code[n])
                    {
                        case '=':
                            if (parn_level == 0)
                                do_aggreg = True;
                            break;
                        case L_CURL:
                            curl_level++;
                            indent = 0;
                            stmt_level = 0;
                            until_parn = 0;
                            if (do_aggreg)
                                in_aggreg = curl_level;
                            break;
                        case R_CURL:
                            curl_level--;
                            indent = 0;
                            stmt_level = 0;
                            until_curl = 0;
                            break;
                        case ':':
                            // "::" means something different entirely
                            if (code[n+1] == ':')
                            {
                                n++;
                            }
                            else
                            {
                                indent = 0;
                                stmt_level = 0;
                                until_parn = 0;
                            }
                            break;
                        case SEMICOLON:
                            if (parn_level == 0)
                            {
                                indent = 0;
                                stmt_level = 0;
                                until_parn = 0;
                                until_curl = 0;
                                if (in_aggreg > curl_level)
                                    in_aggreg = 0;
                            }
                            break;
                        case L_PAREN:
                            parn_level++;
                            indent = 1;
                            break;
                        case R_PAREN:
                            parn_level--;
                            if (until_parn && !parn_level)
                                indent = 0;
                            else
                                indent = 1;
                            break;
                        case ESCAPE:
                            break;
                        default:
                            indent = 1;
                            break;
                    }
                }
            }
        }
    }
}