1772 {
1773 output_lines.clear();
1774 line_mappings.clear();
1775 errors.clear();
1776 conditional_stack.clear();
1777 current_output_line = 1;
1778 included_libraries.clear();
1779 library_line_count = 0;
1780
1782 std::vector<Token> tokens = tokenizer.tokenize();
1783
1784 processTokens(tokens);
1785
1786 if (!conditional_stack.empty()) {
1787 addError(std::format(
1788 "Unclosed @ifdef/@ifndef directive started at line {}",
1789 conditional_stack.back().start_line),
1790 tokens.empty() ? 0 : tokens.back().line);
1791 }
1792
1793 PreprocessResult result;
1794 result.success = errors.empty();
1795 result.errors = errors;
1796 result.line_map = line_mappings;
1797 result.library_line_count = library_line_count;
1798
1799 std::ostringstream oss;
1800 for (size_t i = 0; i < output_lines.size(); ++i) {
1801 oss << output_lines[i];
1802 if (i < output_lines.size() - 1) {
1803 oss << '\n';
1804 }
1805 }
1806 result.source = oss.str();
1807
1808 return result;
1809 }