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; } }
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; } } } } } }