Fixed a file loading bug not covered by the mycology test suite

This commit is contained in:
Julien Dessaux 2021-10-02 00:59:38 +02:00
parent 749caa9e26
commit 483d5c6a46
3 changed files with 38 additions and 8 deletions

View file

@ -36,13 +36,19 @@ func Load(fd io.Reader) (*Field, error) {
data := make([]byte, 4096) data := make([]byte, 4096)
if n, errRead := fd.Read(data); errRead != nil { if n, errRead := fd.Read(data); errRead != nil {
if errRead == io.EOF { if errRead == io.EOF {
if f.ly == 0 && l.l == 0 { if f.ly == 0 {
if l.l == 0 {
return nil, newDecodeError("No instruction on the first line of the file produces an unusable program in Befunge98") return nil, newDecodeError("No instruction on the first line of the file produces an unusable program in Befunge98")
} }
f.x = l.x
}
if l.l > 0 { if l.l > 0 {
f.ly++ f.ly++
if f.lx-f.x < l.l-l.x { if f.x < l.x {
f.lx = l.l - l.x + f.x f.x = l.x
}
if f.lx < l.l+l.x-f.x {
f.lx = l.l + l.x - f.x
} }
f.lines = append(f.lines, *l) f.lines = append(f.lines, *l)
} }
@ -56,12 +62,18 @@ func Load(fd io.Reader) (*Field, error) {
continue continue
} }
if data[i] == '\n' || data[i] == '\r' { if data[i] == '\n' || data[i] == '\r' {
if f.ly == 0 && l.l == 0 { if f.ly == 0 {
if l.l == 0 {
return nil, newDecodeError("No instruction on the first line of the file produces an unusable program in Befunge98") return nil, newDecodeError("No instruction on the first line of the file produces an unusable program in Befunge98")
} }
f.x = l.x
}
f.ly++ f.ly++
if f.lx < l.l { if f.x > l.x {
f.lx = l.l f.x = l.x
}
if f.lx < l.l+l.x-f.x {
f.lx = l.l + l.x - f.x
} }
f.lines = append(f.lines, *l) f.lines = append(f.lines, *l)
l = new(Line) l = new(Line)

View file

@ -38,6 +38,21 @@ func TestLoad(t *testing.T) {
}, },
}, },
} }
// hello2 b98 file
hello2Field := Field{
x: 1,
y: 0,
lx: 33,
ly: 2,
lines: []Line{
Line{x: 33, l: 1, columns: []int{'v'}},
Line{
x: 1,
l: 33,
columns: []int{'@', ' ', '>', ' ', '#', ';', '>', ':', '#', ',', '_', 'e', '-', 'j', ';', ' ', '"', 'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', '"', 'd', 'a', '<'},
},
},
}
// factorial b98 file // factorial b98 file
factorialField := Field{ factorialField := Field{
x: 0, x: 0,
@ -134,6 +149,7 @@ func TestLoad(t *testing.T) {
{"io error", "test_data/minimal.b98", iotest.TimeoutReader, nil, &ReadError{}}, {"io error", "test_data/minimal.b98", iotest.TimeoutReader, nil, &ReadError{}},
{"minimal", "test_data/minimal.b98", nil, &minimalField, nil}, {"minimal", "test_data/minimal.b98", nil, &minimalField, nil},
{"hello", "test_data/hello.b98", nil, &helloField, nil}, {"hello", "test_data/hello.b98", nil, &helloField, nil},
{"hello2", "test_data/hello2.b98", nil, &hello2Field, nil},
{"factorial", "test_data/factorial.b98", nil, &factorialField, nil}, {"factorial", "test_data/factorial.b98", nil, &factorialField, nil},
{"dna", "test_data/dna.b98", nil, &dnaField, nil}, {"dna", "test_data/dna.b98", nil, &dnaField, nil},
{"\\r\\n file", "test_data/rn.b98", nil, &rnField, nil}, {"\\r\\n file", "test_data/rn.b98", nil, &rnField, nil},

View file

@ -0,0 +1,2 @@
v
@ > #;>:#,_e-j; "Hello world!"da<