diff --git a/src/sed/script_line_provider.rs b/src/sed/script_line_provider.rs index 5835d10e..cf945b3d 100644 --- a/src/sed/script_line_provider.rs +++ b/src/sed/script_line_provider.rs @@ -40,7 +40,12 @@ enum State { input_name: String, // Input description (path or script string) line_number: usize, // Current line number }, - Done, // All scripts have been processed + // All scripts have been processed; keeps the last position for errors + // raised at the end of the script. + Done { + input_name: String, + line_number: usize, + }, } impl ScriptLineProvider { @@ -55,16 +60,18 @@ impl ScriptLineProvider { /// Return the currently processed script line number. pub fn get_line_number(&self) -> usize { match &self.state { - State::Active { line_number, .. } => *line_number, - _ => 0, + State::Active { line_number, .. } | State::Done { line_number, .. } => *line_number, + State::NotStarted => 0, } } /// Return the currently processed script descriptive name. pub fn get_input_name(&self) -> &str { match &self.state { - State::Active { input_name, .. } => input_name.as_str(), - _ => "", + State::Active { input_name, .. } | State::Done { input_name, .. } => { + input_name.as_str() + } + State::NotStarted => "", } } @@ -94,7 +101,7 @@ impl ScriptLineProvider { return Ok(Some(line)); } } - State::Done => { + State::Done { .. } => { return Ok(None); } }; @@ -108,7 +115,10 @@ impl ScriptLineProvider { // Move to the next available script source. fn advance_source(&mut self, next_index: usize) -> UResult<()> { if next_index >= self.sources.len() { - self.state = State::Done; + self.state = State::Done { + input_name: self.get_input_name().to_string(), + line_number: self.get_line_number(), + }; return Ok(()); } @@ -151,7 +161,14 @@ impl fmt::Debug for State { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { State::NotStarted => f.debug_struct("NotStarted").finish(), - State::Done => f.debug_struct("Done").finish(), + State::Done { + input_name, + line_number, + } => f + .debug_struct("Done") + .field("input_name", input_name) + .field("line_number", line_number) + .finish(), State::Active { index, input_name, diff --git a/tests/by-util/test_sed.rs b/tests/by-util/test_sed.rs index c604c5a4..e3a31383 100644 --- a/tests/by-util/test_sed.rs +++ b/tests/by-util/test_sed.rs @@ -2487,7 +2487,39 @@ fn test_incomplete_test_command_posix() { .args(&["--posix", "i\\"]) .fails() .code_is(1) - .stderr_is("sed: :0:3: error: incomplete command\n"); + .stderr_is("sed: