@@ -23,7 +23,7 @@ pub struct Settings {
2323 body_numbering : NumberingStyle ,
2424 footer_numbering : NumberingStyle ,
2525 // The variable corresponding to -d
26- section_delimiter : [ char ; 2 ] ,
26+ section_delimiter : String ,
2727 // The variables corresponding to the options -v, -i, -l, -w.
2828 starting_line_number : i64 ,
2929 line_increment : i64 ,
@@ -43,7 +43,7 @@ impl Default for Settings {
4343 header_numbering : NumberingStyle :: None ,
4444 body_numbering : NumberingStyle :: NonEmpty ,
4545 footer_numbering : NumberingStyle :: None ,
46- section_delimiter : [ '\\' , ':' ] ,
46+ section_delimiter : String :: from ( " \\ :" ) ,
4747 starting_line_number : 1 ,
4848 line_increment : 1 ,
4949 join_blank_lines : 1 ,
@@ -120,6 +120,32 @@ impl NumberFormat {
120120 }
121121}
122122
123+ enum SectionDelimiter {
124+ Header ,
125+ Body ,
126+ Footer ,
127+ }
128+
129+ impl SectionDelimiter {
130+ // A valid section delimiter contains the pattern one to three times,
131+ // and nothing else.
132+ fn parse ( s : & str , pattern : & str ) -> Option < Self > {
133+ if s. is_empty ( ) || pattern. is_empty ( ) {
134+ return None ;
135+ }
136+
137+ let pattern_count = s. matches ( pattern) . count ( ) ;
138+ let is_length_ok = pattern_count * pattern. len ( ) == s. len ( ) ;
139+
140+ match ( pattern_count, is_length_ok) {
141+ ( 3 , true ) => Some ( Self :: Header ) ,
142+ ( 2 , true ) => Some ( Self :: Body ) ,
143+ ( 1 , true ) => Some ( Self :: Footer ) ,
144+ _ => None ,
145+ }
146+ }
147+ }
148+
123149pub mod options {
124150 pub const HELP : & str = "help" ;
125151 pub const FILE : & str = "file" ;
@@ -299,14 +325,12 @@ fn nl<T: Read>(reader: &mut BufReader<T>, settings: &Settings) -> UResult<()> {
299325 consecutive_empty_lines = 0 ;
300326 } ;
301327
302- // FIXME section delimiters are hardcoded and settings.section_delimiter is ignored
303- // because --section-delimiter is not correctly implemented yet
304- let _ = settings. section_delimiter ; // XXX suppress "field never read" warning
305- let new_numbering_style = match line. as_str ( ) {
306- "\\ :\\ :\\ :" => Some ( & settings. header_numbering ) ,
307- "\\ :\\ :" => Some ( & settings. body_numbering ) ,
308- "\\ :" => Some ( & settings. footer_numbering ) ,
309- _ => None ,
328+ let new_numbering_style = match SectionDelimiter :: parse ( & line, & settings. section_delimiter )
329+ {
330+ Some ( SectionDelimiter :: Header ) => Some ( & settings. header_numbering ) ,
331+ Some ( SectionDelimiter :: Body ) => Some ( & settings. body_numbering ) ,
332+ Some ( SectionDelimiter :: Footer ) => Some ( & settings. footer_numbering ) ,
333+ None => None ,
310334 } ;
311335
312336 if let Some ( new_style) = new_numbering_style {
0 commit comments