@@ -407,6 +407,17 @@ public static string ToString(object value)
407407
408408 #endregion
409409
410+ public static void WriteString ( TextWriter writer , string value )
411+ {
412+ WriteEscapedString ( value , StringDelimiterInfo . DoubleQuote , writer ) ;
413+ }
414+
415+ public static void WriteString ( TextWriter writer , string value , string delimiter )
416+ {
417+ var delm = StringDelimiterInfo . FromStartDelimiter ( delimiter ) ;
418+ WriteEscapedString ( value , delm , writer ) ;
419+ }
420+
410421 internal static void WriteEscapedString ( string value , StringDelimiterInfo delimiter , TextWriter writer )
411422 {
412423 Debug . Assert ( delimiter != null ) ;
@@ -433,6 +444,9 @@ internal static void WriteEscapedString(string value, StringDelimiterInfo delimi
433444 {
434445 switch ( c )
435446 {
447+ case '\\ ' :
448+ writer . Write ( "\\ " ) ;
449+ break ;
436450 case '\a ' :
437451 writer . Write ( "\\ a" ) ;
438452 break ;
@@ -473,52 +487,93 @@ internal static void WriteEscapedString(string value, StringDelimiterInfo delimi
473487
474488 internal sealed class StringDelimiterInfo : IEquatable < StringDelimiterInfo >
475489 {
476-
477- private readonly int data ;
478-
479490 public static readonly StringDelimiterInfo SingleQuote = new StringDelimiterInfo ( - 1 , "'" , "'" ) ;
480491 public static readonly StringDelimiterInfo DoubleQuote = new StringDelimiterInfo ( - 2 , "\" " , "\" " ) ;
481492 public static readonly StringDelimiterInfo Brackets0 = new StringDelimiterInfo ( 0 , "[[" , "]]" ) ;
482- public static readonly StringDelimiterInfo Brackets1 = new StringDelimiterInfo ( 0 , "[=[" , "]=]" ) ;
483- public static readonly StringDelimiterInfo Brackets2 = new StringDelimiterInfo ( 0 , "[==[" , "]==]" ) ;
484- public static readonly StringDelimiterInfo Brackets3 = new StringDelimiterInfo ( 0 , "[===[" , "]===]" ) ;
485- public static readonly StringDelimiterInfo Brackets4 = new StringDelimiterInfo ( 0 , "[====[" , "]====]" ) ;
493+ public static readonly StringDelimiterInfo Brackets1 = new StringDelimiterInfo ( 1 , "[=[" , "]=]" ) ;
494+ public static readonly StringDelimiterInfo Brackets2 = new StringDelimiterInfo ( 2 , "[==[" , "]==]" ) ;
495+ public static readonly StringDelimiterInfo Brackets3 = new StringDelimiterInfo ( 3 , "[===[" , "]===]" ) ;
496+ public static readonly StringDelimiterInfo Brackets4 = new StringDelimiterInfo ( 4 , "[====[" , "]====]" ) ;
497+ public static readonly StringDelimiterInfo Brackets5 = new StringDelimiterInfo ( 5 , "[=====[" , "]=====]" ) ;
498+ public static readonly StringDelimiterInfo Brackets6 = new StringDelimiterInfo ( 6 , "[======[" , "]======]" ) ;
499+ public static readonly StringDelimiterInfo Brackets7 = new StringDelimiterInfo ( 7 , "[=======[" , "]=======]" ) ;
500+ public static readonly StringDelimiterInfo Brackets8 = new StringDelimiterInfo ( 8 , "[========[" , "]========]" ) ;
501+
502+ private static readonly StringDelimiterInfo [ ] bracketsByLevel =
503+ {
504+ Brackets0 ,
505+ Brackets1 ,
506+ Brackets2 ,
507+ Brackets3 ,
508+ Brackets4 ,
509+ Brackets5 ,
510+ Brackets6 ,
511+ Brackets7 ,
512+ Brackets8 ,
513+ } ;
486514
487515 public static StringDelimiterInfo FromStartDelimiter ( string delimiter )
488516 {
489517 if ( delimiter == null ) throw new ArgumentNullException ( nameof ( delimiter ) ) ;
490518 if ( delimiter . Length == 0 ) goto INVALID_DELIMITER ;
491- switch ( delimiter )
519+ if ( delimiter . Length <= 10 )
492520 {
493- case "'" : return new StringDelimiterInfo ( - 1 , "'" , "'" ) ;
494- case "\" " : return new StringDelimiterInfo ( - 2 , "\" " , "\" " ) ;
495- case "[[" : return new StringDelimiterInfo ( 0 , "[[" , "]]" ) ;
496- case "[=[" : return new StringDelimiterInfo ( 1 , "[=[" , "]=]" ) ;
497- case "[==[" : return new StringDelimiterInfo ( 2 , "[==[" , "]==]" ) ;
498- case "[===[" : return new StringDelimiterInfo ( 3 , "[===[" , "]===]" ) ;
499- case "[====[" : return new StringDelimiterInfo ( 4 , "[====[" , "]====]" ) ;
500- case "[=====[" : return new StringDelimiterInfo ( 5 , "[=====[" , "]=====]" ) ;
501- case "[======[" : return new StringDelimiterInfo ( 6 , "[======[" , "]======]" ) ;
502- case "[=======[" : return new StringDelimiterInfo ( 7 , "[=======[" , "]=======]" ) ;
503- case "[========[" : return new StringDelimiterInfo ( 8 , "[========[" , "]========]" ) ;
504- default :
505- if ( delimiter [ 0 ] != '[' ) goto INVALID_DELIMITER ;
506- if ( delimiter [ delimiter . Length - 1 ] != '[' ) goto INVALID_DELIMITER ;
507- for ( int i = 1 ; i < delimiter . Length - 1 ; i ++ ) if ( delimiter [ i ] != '=' ) goto INVALID_DELIMITER ;
508- var sb = new StringBuilder ( "]" , delimiter . Length ) ;
509- sb . Append ( '=' , delimiter . Length - 2 ) ;
510- sb . Append ( ']' ) ;
511- return new StringDelimiterInfo ( delimiter . Length - 2 , delimiter , sb . ToString ( ) ) ;
521+ switch ( delimiter )
522+ {
523+ case "'" : return SingleQuote ;
524+ case "\" " : return DoubleQuote ;
525+ case "[[" : return Brackets0 ;
526+ case "[=[" : return Brackets1 ;
527+ case "[==[" : return Brackets2 ;
528+ case "[===[" : return Brackets3 ;
529+ case "[====[" : return Brackets4 ;
530+ case "[=====[" : return Brackets5 ;
531+ case "[======[" : return Brackets6 ;
532+ case "[=======[" : return Brackets7 ;
533+ case "[========[" : return Brackets8 ;
534+ default : goto INVALID_DELIMITER ;
535+ }
512536 }
513- INVALID_DELIMITER :
537+ if ( delimiter [ 0 ] != '[' ) goto INVALID_DELIMITER ;
538+ if ( delimiter [ delimiter . Length - 1 ] != '[' ) goto INVALID_DELIMITER ;
539+ for ( int i = 1 ; i < delimiter . Length - 1 ; i ++ )
540+ if ( delimiter [ i ] != '=' )
541+ goto INVALID_DELIMITER ;
542+ var sb = new StringBuilder ( "]" , delimiter . Length ) ;
543+ sb . Append ( '=' , delimiter . Length - 2 ) ;
544+ sb . Append ( ']' ) ;
545+ return new StringDelimiterInfo ( delimiter . Length - 2 , delimiter , sb . ToString ( ) ) ;
546+ INVALID_DELIMITER :
514547 throw new ArgumentException ( "Invalid string delimiter." , nameof ( delimiter ) ) ;
515548 }
516549
550+ public static StringDelimiterInfo FromBracketLevel ( int bracketLevel )
551+ {
552+ switch ( bracketLevel )
553+ {
554+ case - 2 : return DoubleQuote ;
555+ case - 1 : return SingleQuote ;
556+ default :
557+ if ( bracketLevel < 0 )
558+ throw new ArgumentException ( "Invalid bracket level." , nameof ( bracketLevel ) ) ;
559+ if ( bracketLevel < bracketsByLevel . Length )
560+ return bracketsByLevel [ bracketLevel ] ;
561+ var sb = new StringBuilder ( "[" , bracketLevel + 2 ) ;
562+ sb . Append ( '=' , bracketLevel ) ;
563+ sb . Append ( '[' ) ;
564+ var startDelm = sb . ToString ( ) ;
565+ sb [ 0 ] = ']' ;
566+ sb [ sb . Length - 1 ] = ']' ;
567+ var endDelim = sb . ToString ( ) ;
568+ return new StringDelimiterInfo ( bracketLevel , startDelm , endDelim ) ;
569+ }
570+ }
571+
517572 private StringDelimiterInfo ( int data , string startDelimiter , string endDelimiter )
518573 {
519574 Debug . Assert ( startDelimiter != null ) ;
520575 Debug . Assert ( endDelimiter != null ) ;
521- this . data = data ;
576+ this . BracketLevel = data ;
522577 StartDelimiter = startDelimiter ;
523578 EndDelimiter = endDelimiter ;
524579 }
@@ -527,20 +582,20 @@ private StringDelimiterInfo(int data, string startDelimiter, string endDelimiter
527582
528583 public string EndDelimiter { get ; }
529584
530- public bool IsSingleQuote => data == - 1 ;
585+ public bool IsSingleQuote => BracketLevel == - 1 ;
531586
532- public bool IsDoubleQuote => data == - 2 ;
587+ public bool IsDoubleQuote => BracketLevel == - 2 ;
533588
534- public bool IsBracket => data >= 0 ;
589+ public bool IsBracket => BracketLevel >= 0 ;
535590
536- public int BracketLevel => data ;
591+ public int BracketLevel { get ; }
537592
538593 /// <inheritdoc />
539594 public bool Equals ( StringDelimiterInfo other )
540595 {
541596 if ( ReferenceEquals ( null , other ) ) return false ;
542597 if ( ReferenceEquals ( this , other ) ) return true ;
543- return data == other . data ;
598+ return BracketLevel == other . BracketLevel ;
544599 }
545600
546601 /// <inheritdoc />
@@ -554,7 +609,7 @@ public override bool Equals(object obj)
554609 /// <inheritdoc />
555610 public override int GetHashCode ( )
556611 {
557- return data ;
612+ return BracketLevel ;
558613 }
559614
560615 public static bool operator == ( StringDelimiterInfo left , StringDelimiterInfo right )
0 commit comments