@@ -1006,12 +1006,16 @@ format_output(struct playback* pb)
10061006
10071007 out = hrmp_append (out , "\r" );
10081008
1009- for (const char * p = fmt ; p && * p ; ++ p )
1009+ size_t len = strlen (fmt );
1010+
1011+ for (size_t i = 0 ; i < len ; ++ i )
10101012 {
1011- if (* p == '%' && * (p + 1 ) != '\0' )
1013+ char c = fmt [i ];
1014+
1015+ if (c == '%' && (i + 1 ) < len )
10121016 {
1013- ++ p ;
1014- switch (* p )
1017+ ++ i ;
1018+ switch (fmt [ i ] )
10151019 {
10161020 case 'n' :
10171021 out = hrmp_append_int (out , pb -> file_number );
@@ -1095,13 +1099,62 @@ format_output(struct playback* pb)
10951099 break ;
10961100 default :
10971101 out = hrmp_append_char (out , '%' );
1098- out = hrmp_append_char (out , * p );
1102+ out = hrmp_append_char (out , fmt [ i ] );
10991103 break ;
11001104 }
11011105 }
1106+ else if (c == '\\' && (i + 1 ) < len )
1107+ {
1108+ char n = fmt [i + 1 ];
1109+
1110+ if (n == '0' && (i + 3 ) < len && fmt [i + 2 ] == '3' && fmt [i + 3 ] == '3' )
1111+ {
1112+ /* Octal escape for ESC: \033 */
1113+ out = hrmp_append_char (out , '\x1b' );
1114+ i += 3 ;
1115+ }
1116+ else if ((n == 'x' || n == 'X' ) &&
1117+ (i + 3 ) < len && (fmt [i + 2 ] == '1' && (fmt [i + 3 ] == 'b' || fmt [i + 3 ] == 'B' )))
1118+ {
1119+ /* Hex escape for ESC: \x1b or \x1B */
1120+ out = hrmp_append_char (out , '\x1b' );
1121+ i += 3 ;
1122+ }
1123+ else if (n == 'e' || n == 'E' )
1124+ {
1125+ /* GNU-style \e escape for ESC */
1126+ out = hrmp_append_char (out , '\x1b' );
1127+ ++ i ;
1128+ }
1129+ else if (n == 'n' )
1130+ {
1131+ out = hrmp_append_char (out , '\n' );
1132+ ++ i ;
1133+ }
1134+ else if (n == 'r' )
1135+ {
1136+ out = hrmp_append_char (out , '\r' );
1137+ ++ i ;
1138+ }
1139+ else if (n == 't' )
1140+ {
1141+ out = hrmp_append_char (out , '\t' );
1142+ ++ i ;
1143+ }
1144+ else if (n == '\\' )
1145+ {
1146+ out = hrmp_append_char (out , '\\' );
1147+ ++ i ;
1148+ }
1149+ else
1150+ {
1151+ /* Unknown escape, keep the backslash literal */
1152+ out = hrmp_append_char (out , c );
1153+ }
1154+ }
11021155 else
11031156 {
1104- out = hrmp_append_char (out , * p );
1157+ out = hrmp_append_char (out , c );
11051158 }
11061159 }
11071160
0 commit comments