@@ -238,106 +238,6 @@ impl Source for ReplaceSource {
238238 get_map ( & ObjectPool :: default ( ) , chunks. as_ref ( ) , options)
239239 }
240240
241- #[ allow( unsafe_code) ]
242- fn write_to_string ( & self , string : & mut String ) {
243- let inner_chunks = self . inner . rope ( ) ;
244-
245- let mut pos: usize = 0 ;
246- let mut replacement_idx: usize = 0 ;
247- let mut replacement_end: Option < usize > = None ;
248- let mut next_replacement: Option < usize > = ( replacement_idx
249- < self . replacements . len ( ) )
250- . then ( || self . replacements [ replacement_idx] . start as usize ) ;
251-
252- ' chunk_loop: for chunk in inner_chunks {
253- let mut chunk_pos = 0 ;
254- let end_pos = pos + chunk. len ( ) ;
255-
256- // Skip over when it has been replaced
257- if let Some ( replacement_end) =
258- replacement_end. filter ( |replacement_end| * replacement_end > pos)
259- {
260- // Skip over the whole chunk
261- if replacement_end >= end_pos {
262- pos = end_pos;
263- continue ;
264- }
265- // Partially skip over chunk
266- chunk_pos = replacement_end - pos;
267- pos += chunk_pos;
268- }
269-
270- // Is a replacement in the chunk?
271- while let Some ( next_replacement_pos) = next_replacement
272- . filter ( |next_replacement_pos| * next_replacement_pos < end_pos)
273- {
274- if next_replacement_pos > pos {
275- // Emit chunk until replacement
276- let offset = next_replacement_pos - pos;
277- let chunk_slice =
278- unsafe { & chunk. get_unchecked ( chunk_pos..( chunk_pos + offset) ) } ;
279- string. push_str ( chunk_slice) ;
280- chunk_pos += offset;
281- pos = next_replacement_pos;
282- }
283- // Insert replacement content split into chunks by lines
284- let replacement =
285- unsafe { & self . replacements . get_unchecked ( replacement_idx) } ;
286- string. push_str ( & replacement. content ) ;
287-
288- // Remove replaced content by settings this variable
289- replacement_end = if let Some ( replacement_end) = replacement_end {
290- Some ( replacement_end. max ( replacement. end as usize ) )
291- } else {
292- Some ( replacement. end as usize )
293- } ;
294-
295- // Move to next replacement
296- replacement_idx += 1 ;
297- next_replacement = if replacement_idx < self . replacements . len ( ) {
298- Some ( unsafe {
299- self . replacements . get_unchecked ( replacement_idx) . start as usize
300- } )
301- } else {
302- None
303- } ;
304-
305- // Skip over when it has been replaced
306- let offset = chunk. len ( ) as i64 - end_pos as i64
307- + replacement_end. unwrap ( ) as i64
308- - chunk_pos as i64 ;
309- if offset > 0 {
310- // Skip over whole chunk
311- if replacement_end
312- . is_some_and ( |replacement_end| replacement_end >= end_pos)
313- {
314- pos = end_pos;
315- continue ' chunk_loop;
316- }
317-
318- // Partially skip over chunk
319- chunk_pos += offset as usize ;
320- pos += offset as usize ;
321- }
322- }
323-
324- // Emit remaining chunk
325- if chunk_pos < chunk. len ( ) {
326- let chunk = unsafe { & chunk. get_unchecked ( chunk_pos..) } ;
327- string. push_str ( chunk) ;
328- }
329- pos = end_pos;
330- }
331-
332- // Handle remaining replacements one by one
333- while replacement_idx < self . replacements . len ( ) {
334- let content =
335- unsafe { & self . replacements . get_unchecked ( replacement_idx) . content } ;
336- string. push_str ( content) ;
337- replacement_idx += 1 ;
338- }
339- }
340-
341241 fn to_writer ( & self , writer : & mut dyn std:: io:: Write ) -> std:: io:: Result < ( ) > {
342242 for text in self . rope ( ) {
343243 writer. write_all ( text. as_bytes ( ) ) ?;
0 commit comments