@@ -134,14 +134,17 @@ __get_cxx_version ()
134134
135135 auto input_guard = input_redirection (config.allow_stdin );
136136
137- // Check for magics
138- for (auto & pre : preamble_manager.preamble )
137+ if (code.find (" %undo" ) != 0 )
139138 {
140- if (pre .second .is_match (code))
139+ // Check for magics
140+ for (auto & pre : preamble_manager.preamble )
141141 {
142- pre .second .apply (code, kernel_res);
143- cb (kernel_res);
144- return ;
142+ if (pre .second .is_match (code))
143+ {
144+ pre .second .apply (code, kernel_res);
145+ cb (kernel_res);
146+ return ;
147+ }
145148 }
146149 }
147150
@@ -169,7 +172,32 @@ __get_cxx_version ()
169172 try
170173 {
171174 StreamRedirectRAII R (err);
172- compilation_result = Cpp::Process (code.c_str ());
175+ if (code.rfind (" %undo" , 0 ) == 0 )
176+ {
177+ int n = 1 ; // Default value
178+ if (code.length () > 5 )
179+ {
180+ try
181+ {
182+ n = std::stoi (code.substr (6 ));
183+ }
184+ catch (const std::invalid_argument&)
185+ {
186+ throw std::runtime_error (
187+ " Invalid format for %undo. Expected '%undo n' where n is an integer."
188+ );
189+ }
190+ catch (const std::out_of_range&)
191+ {
192+ throw std::runtime_error (" Number out of range for %undo." );
193+ }
194+ }
195+ compilation_result = Cpp::Undo (n) ? true : false ;
196+ }
197+ else
198+ {
199+ compilation_result = Cpp::Process (code.c_str ());
200+ }
173201 }
174202 catch (std::exception& e)
175203 {
0 commit comments