@@ -361,14 +361,17 @@ fn cooked_string(input: Cursor) -> Result<Cursor, LexError> {
361
361
}
362
362
}
363
363
Some ( ( _, ch @ '\n' ) ) | Some ( ( _, ch @ '\r' ) ) => {
364
- if ch == '\r' && chars. next ( ) . map_or ( true , |( _, ch) | ch != '\n' ) {
365
- return Err ( LexError ) ;
366
- }
367
- while let Some ( & ( _, ch) ) = chars. peek ( ) {
368
- if ch. is_whitespace ( ) {
369
- chars. next ( ) ;
370
- } else {
371
- break ;
364
+ let mut last = ch;
365
+ loop {
366
+ if last == '\r' && chars. next ( ) . map_or ( true , |( _, ch) | ch != '\n' ) {
367
+ return Err ( LexError ) ;
368
+ }
369
+ match chars. peek ( ) {
370
+ Some ( ( _, ch) ) if ch. is_whitespace ( ) => {
371
+ last = * ch;
372
+ chars. next ( ) ;
373
+ }
374
+ _ => break ,
372
375
}
373
376
}
374
377
}
@@ -392,7 +395,7 @@ fn byte_string(input: Cursor) -> Result<Cursor, LexError> {
392
395
393
396
fn cooked_byte_string ( mut input : Cursor ) -> Result < Cursor , LexError > {
394
397
let mut bytes = input. bytes ( ) . enumerate ( ) ;
395
- ' outer : while let Some ( ( offset, b) ) = bytes. next ( ) {
398
+ while let Some ( ( offset, b) ) = bytes. next ( ) {
396
399
match b {
397
400
b'"' => {
398
401
let input = input. advance ( offset + 1 ) ;
@@ -414,18 +417,23 @@ fn cooked_byte_string(mut input: Cursor) -> Result<Cursor, LexError> {
414
417
Some ( ( _, b'n' ) ) | Some ( ( _, b'r' ) ) | Some ( ( _, b't' ) ) | Some ( ( _, b'\\' ) )
415
418
| Some ( ( _, b'0' ) ) | Some ( ( _, b'\'' ) ) | Some ( ( _, b'"' ) ) => { }
416
419
Some ( ( newline, b @ b'\n' ) ) | Some ( ( newline, b @ b'\r' ) ) => {
417
- if b == b'\r' && bytes. next ( ) . map_or ( true , |( _, b) | b != b'\n' ) {
418
- return Err ( LexError ) ;
419
- }
420
+ let mut last = b as char ;
420
421
let rest = input. advance ( newline + 1 ) ;
421
- for ( offset, ch) in rest. char_indices ( ) {
422
- if !ch. is_whitespace ( ) {
423
- input = rest. advance ( offset) ;
424
- bytes = input. bytes ( ) . enumerate ( ) ;
425
- continue ' outer;
422
+ let mut chars = rest. char_indices ( ) ;
423
+ loop {
424
+ if last == '\r' && chars. next ( ) . map_or ( true , |( _, ch) | ch != '\n' ) {
425
+ return Err ( LexError ) ;
426
+ }
427
+ match chars. next ( ) {
428
+ Some ( ( _, ch) ) if ch. is_whitespace ( ) => last = ch,
429
+ Some ( ( offset, _) ) => {
430
+ input = rest. advance ( offset) ;
431
+ bytes = input. bytes ( ) . enumerate ( ) ;
432
+ break ;
433
+ }
434
+ None => return Err ( LexError ) ,
426
435
}
427
436
}
428
- break ;
429
437
}
430
438
_ => break ,
431
439
} ,
0 commit comments