| 9759 | } |
| 9760 | |
| 9761 | constexpr void Tokenizer::get_next_code_point() { |
| 9762 | ada_log("Tokenizer::get_next_code_point called with index=", next_index); |
| 9763 | ADA_ASSERT_TRUE(next_index < input.size()); |
| 9764 | // this assumes that we have a valid, non-truncated UTF-8 stream. |
| 9765 | code_point = 0; |
| 9766 | size_t number_bytes = 0; |
| 9767 | unsigned char first_byte = input[next_index]; |
| 9768 | |
| 9769 | if ((first_byte & 0x80) == 0) { |
| 9770 | // 1-byte character (ASCII) |
| 9771 | next_index++; |
| 9772 | code_point = first_byte; |
| 9773 | ada_log("Tokenizer::get_next_code_point returning ASCII code point=", |
| 9774 | uint32_t(code_point)); |
| 9775 | ada_log("Tokenizer::get_next_code_point next_index =", next_index, |
| 9776 | " input.size()=", input.size()); |
| 9777 | return; |
| 9778 | } |
| 9779 | ada_log("Tokenizer::get_next_code_point read first byte=", |
| 9780 | uint32_t(first_byte)); |
| 9781 | if ((first_byte & 0xE0) == 0xC0) { |
| 9782 | code_point = first_byte & 0x1F; |
| 9783 | number_bytes = 2; |
| 9784 | ada_log("Tokenizer::get_next_code_point two bytes"); |
| 9785 | } else if ((first_byte & 0xF0) == 0xE0) { |
| 9786 | code_point = first_byte & 0x0F; |
| 9787 | number_bytes = 3; |
| 9788 | ada_log("Tokenizer::get_next_code_point three bytes"); |
| 9789 | } else if ((first_byte & 0xF8) == 0xF0) { |
| 9790 | code_point = first_byte & 0x07; |
| 9791 | number_bytes = 4; |
| 9792 | ada_log("Tokenizer::get_next_code_point four bytes"); |
| 9793 | } |
| 9794 | ADA_ASSERT_TRUE(number_bytes + next_index <= input.size()); |
| 9795 | |
| 9796 | for (size_t i = 1 + next_index; i < number_bytes + next_index; ++i) { |
| 9797 | unsigned char byte = input[i]; |
| 9798 | ada_log("Tokenizer::get_next_code_point read byte=", uint32_t(byte)); |
| 9799 | code_point = (code_point << 6) | (byte & 0x3F); |
| 9800 | } |
| 9801 | ada_log("Tokenizer::get_next_code_point returning non-ASCII code point=", |
| 9802 | uint32_t(code_point)); |
| 9803 | ada_log("Tokenizer::get_next_code_point next_index =", next_index, |
| 9804 | " input.size()=", input.size()); |
| 9805 | next_index += number_bytes; |
| 9806 | } |
| 9807 | |
| 9808 | constexpr void Tokenizer::seek_and_get_next_code_point(size_t new_index) { |
| 9809 | ada_log("Tokenizer::seek_and_get_next_code_point called with new_index=", |