| 223 | } |
| 224 | |
| 225 | void IfcCharacterDecoder::skip() { |
| 226 | unsigned int parse_state = 0; |
| 227 | char current_char; |
| 228 | unsigned int hex_count = 0; |
| 229 | while ((current_char = stream_->peek()) != 0) { |
| 230 | if (EXPECTS_CHARACTER(parse_state)) { |
| 231 | parse_state = 0; |
| 232 | } else if (current_char == '\'' && (parse_state == 0U)) { |
| 233 | parse_state = APOSTROPHE; |
| 234 | } else if (current_char == '\\' && (parse_state == 0U)) { |
| 235 | parse_state = FIRST_SOLIDUS; |
| 236 | } else if (current_char == '\\' && EXPECTS_SOLIDUS(parse_state)) { |
| 237 | if (((parse_state & ALPHABET_DEFINITION) != 0U) || |
| 238 | ((parse_state & IGNORED_DIRECTIVE) != 0U) || |
| 239 | ((parse_state & ENDEXTENDED_0) != 0U)) { |
| 240 | parse_state = hex_count = 0; |
| 241 | } else if ((parse_state & ENCOUNTERED_HEX) != 0U) { |
| 242 | parse_state += THIRD_SOLIDUS; |
| 243 | parse_state -= ENCOUNTERED_HEX; |
| 244 | } else { |
| 245 | parse_state += SECOND_SOLIDUS; |
| 246 | } |
| 247 | } else if (current_char == 'X' && EXPECTS_ENDEXTENDED_X(parse_state)) { |
| 248 | parse_state += ENDEXTENDED_X; |
| 249 | } else if (current_char == '0' && EXPECTS_ENDEXTENDED_0(parse_state)) { |
| 250 | parse_state += ENDEXTENDED_0; |
| 251 | } else if (current_char == 'X' && EXPECTS_ARBITRARY(parse_state)) { |
| 252 | parse_state += ARBITRARY; |
| 253 | } else if (current_char == '2' && EXPECTS_ARBITRARY2(parse_state)) { |
| 254 | parse_state += EXTENDED2; |
| 255 | } else if (current_char == '4' && EXPECTS_ARBITRARY2(parse_state)) { |
| 256 | parse_state += EXTENDED2 + EXTENDED4; |
| 257 | } else if (current_char == 'P' && EXPECTS_ALPHABET(parse_state)) { |
| 258 | parse_state += ALPHABET; |
| 259 | } else if ((current_char == 'N' || current_char == 'F') && EXPECTS_N_OR_F(parse_state)) { |
| 260 | parse_state += IGNORED_DIRECTIVE; |
| 261 | } else if (IS_VALID_ALPHABET_DEFINITION(current_char) && EXPECTS_ALPHABET_DEFINITION(parse_state)) { |
| 262 | parse_state += ALPHABET_DEFINITION; |
| 263 | } else if (current_char == 'S' && EXPECTS_PAGE(parse_state)) { |
| 264 | parse_state += PAGE; |
| 265 | } else if (IS_HEXADECIMAL(current_char) && EXPECTS_HEX(parse_state)) { |
| 266 | parse_state += HEX((++hex_count)); |
| 267 | if ((hex_count == 2 && ((parse_state & EXTENDED2) == 0U)) || |
| 268 | (hex_count == 4 && ((parse_state & EXTENDED4) == 0U)) || |
| 269 | (hex_count == 8)) { |
| 270 | if (hex_count == 2) { |
| 271 | parse_state = 0; |
| 272 | } else { |
| 273 | CLEAR_HEX(parse_state); |
| 274 | parse_state |= ENCOUNTERED_HEX; |
| 275 | } |
| 276 | hex_count = 0; |
| 277 | } |
| 278 | } else if ((parse_state != 0U) && !( |
| 279 | (current_char == '\\' && parse_state == FIRST_SOLIDUS) || |
| 280 | (current_char == '\'' && parse_state == APOSTROPHE))) { |
| 281 | if (parse_state == APOSTROPHE && current_char != '\'') { |
| 282 | break; |