Skip to content

Commit 28865fa

Browse files
committed
Fix of behavior of heredoc witout eof
1 parent 13cd647 commit 28865fa

File tree

5 files changed

+15
-6
lines changed

5 files changed

+15
-6
lines changed

error

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,3 +101,4 @@
101101
./test_fixed.bash
102102
./test_fixed.bash
103103
./test_builtins.bash
104+
./test_fixed.bash

src/elements/command.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,7 @@ pub trait Command {
117117
self.get_text().replace("\n", " ")
118118
}
119119
fn get_redirects(&mut self) -> &mut Vec<Redirect>;
120-
fn get_lineno(&mut self) -> usize {
121-
panic!("IMPLEMENT!!")
122-
}
120+
fn get_lineno(&mut self) -> usize;
123121
fn set_force_fork(&mut self);
124122
fn boxed_clone(&self) -> Box<dyn Command>;
125123
fn force_fork(&self) -> bool;
@@ -129,13 +127,14 @@ pub trait Command {
129127
feeder: &mut Feeder,
130128
core: &mut ShellCore,
131129
) -> Result<(), ParseError> {
130+
let lineno = self.get_lineno();
132131
for r in self.get_redirects().iter_mut() {
133132
if r.called_as_heredoc {
134133
continue;
135134
}
136135
if r.symbol == "<<" || r.symbol == "<<-" {
137136
r.called_as_heredoc = true;
138-
r.eat_heredoc(feeder, core)?;
137+
r.eat_heredoc(feeder, core, lineno)?;
139138
}
140139
}
141140
Ok(())

src/elements/command/simple.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@ impl Command for SimpleCommand {
9999
fn force_fork(&self) -> bool {
100100
self.force_fork
101101
}
102+
103+
fn get_lineno(&mut self) -> usize {
104+
self.lineno
105+
}
102106
}
103107

104108
impl SimpleCommand {
12 KB
Binary file not shown.

src/elements/io/redirect.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::elements::word::WordMode;
99
use crate::error::exec::ExecError;
1010
use crate::error::parse::ParseError;
1111
use crate::utils::{exit, file_check};
12-
use crate::{Feeder, ShellCore};
12+
use crate::{error, Feeder, ShellCore};
1313
use nix::unistd;
1414
use nix::unistd::ForkResult;
1515
use std::fs::{File, OpenOptions};
@@ -282,6 +282,7 @@ impl Redirect {
282282
&mut self,
283283
feeder: &mut Feeder,
284284
core: &mut ShellCore,
285+
lineno: usize,
285286
) -> Result<(), ParseError> {
286287
let remove_tab = self.symbol == "<<-";
287288
let end = match self.right.eval_as_value(core) {
@@ -297,7 +298,11 @@ impl Redirect {
297298

298299
loop {
299300
if feeder.is_empty() {
300-
feeder.feed_additional_line(core)?;
301+
if feeder.feed_additional_line(core).is_err() {
302+
let msg = format!("warning: here-document at line {} delimited by end-of-file (wanted {})", lineno, &self.right.text);
303+
error::print(&msg, core);
304+
break;
305+
}
301306

302307
if remove_tab {
303308
let len = feeder.scanner_tabs();

0 commit comments

Comments
 (0)