From 197cd168167c24f587a9f423b52c958c14834110 Mon Sep 17 00:00:00 2001 From: Rob Hagemans Date: Sat, 9 Mar 2024 20:34:19 +0000 Subject: [PATCH 1/5] add test for issue #230: crash on AUTO . --- tests/basic/gwbasic/AUTO_dot/PCBASIC.INI | 5 ++++ tests/basic/gwbasic/AUTO_dot/TEST.BAS | 13 ++++++++++ tests/basic/gwbasic/AUTO_dot/model/OUTPUT.TXT | 26 +++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 tests/basic/gwbasic/AUTO_dot/PCBASIC.INI create mode 100644 tests/basic/gwbasic/AUTO_dot/TEST.BAS create mode 100644 tests/basic/gwbasic/AUTO_dot/model/OUTPUT.TXT diff --git a/tests/basic/gwbasic/AUTO_dot/PCBASIC.INI b/tests/basic/gwbasic/AUTO_dot/PCBASIC.INI new file mode 100644 index 000000000..969beecc6 --- /dev/null +++ b/tests/basic/gwbasic/AUTO_dot/PCBASIC.INI @@ -0,0 +1,5 @@ +[pcbasic] +font=default +run=TEST.BAS +soft-linefeed=True +keys=rem\r\x03list\rrun 1000\rsystem\r diff --git a/tests/basic/gwbasic/AUTO_dot/TEST.BAS b/tests/basic/gwbasic/AUTO_dot/TEST.BAS new file mode 100644 index 000000000..55ee768b0 --- /dev/null +++ b/tests/basic/gwbasic/AUTO_dot/TEST.BAS @@ -0,0 +1,13 @@ +20 AUTO . +999 END +1000 N$="output.txt" ' RUN 1000 to dump screen +1010 DEF SEG=&HB800 +1020 OPEN N$ FOR OUTPUT AS 1 +1030 FOR Y = 0 TO 24 +1040 FOR X = 0 TO 79 +1050 PRINT #1, CHR$(PEEK(2*(Y*80+X))); +1060 NEXT +1065 PRINT #1, "" +1070 NEXT +1080 CLOSE 1 + diff --git a/tests/basic/gwbasic/AUTO_dot/model/OUTPUT.TXT b/tests/basic/gwbasic/AUTO_dot/model/OUTPUT.TXT new file mode 100644 index 000000000..7d66c9e89 --- /dev/null +++ b/tests/basic/gwbasic/AUTO_dot/model/OUTPUT.TXT @@ -0,0 +1,26 @@ +1080*rem +1090 +Ok˙ +list +20 AUTO . +999 END +1000 N$="output.txt" ' RUN 1000 to dump screen +1010 DEF SEG=&HB800 +1020 OPEN N$ FOR OUTPUT AS 1 +1030 FOR Y = 0 TO 24 +1040 FOR X = 0 TO 79 +1050 PRINT #1, CHR$(PEEK(2*(Y*80+X))); +1060 NEXT +1065 PRINT #1, "" +1070 NEXT +1080 REM +Ok˙ +run 1000 + + + + + + + + \ No newline at end of file From 5ddb44f60410d2d81f0c6b0884c502df65a5de08 Mon Sep 17 00:00:00 2001 From: Rob Hagemans Date: Sat, 9 Mar 2024 20:37:38 +0000 Subject: [PATCH 2/5] fix issue #230: crash on AUTO . --- pcbasic/basic/implementation.py | 3 ++- pcbasic/basic/program.py | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/pcbasic/basic/implementation.py b/pcbasic/basic/implementation.py index a85a3dc9a..7a0b8650f 100644 --- a/pcbasic/basic/implementation.py +++ b/pcbasic/basic/implementation.py @@ -587,9 +587,10 @@ def edit_(self, args): def auto_(self, args): """AUTO: enter automatic line numbering mode.""" linenum, increment = args + # linenum is None if unspecified, b'.' if given as `.` from_line, = self.program.explicit_lines(linenum) # reset linenum and increment on each call of AUTO (even in AUTO mode) - self._auto_linenum = linenum if linenum is not None else 10 + self._auto_linenum = from_line if from_line is not None else 10 self._auto_increment = increment if increment is not None else 10 # move program pointer to end self.interpreter.set_pointer(False) diff --git a/pcbasic/basic/program.py b/pcbasic/basic/program.py index f22aa55d9..367d80651 100644 --- a/pcbasic/basic/program.py +++ b/pcbasic/basic/program.py @@ -77,7 +77,9 @@ def erase(self): self.bytecode.write(b'\0\0\0') self.protected = False self.line_numbers = {65536: 0} - self.last_stored = None + # if nothing has been stored, the only place . does anything is auto + # and AUTO . starts from 0 in that case + self.last_stored = 0 self.code_size = self.bytecode.tell() self.bytecode.truncate() From 9478e81103d1d8e2a8198225dd0c94ed80489c8b Mon Sep 17 00:00:00 2001 From: Rob Hagemans Date: Sat, 16 Mar 2024 09:47:40 +0000 Subject: [PATCH 3/5] restructure AUTO_dot to separate out DUMPSCRN utility --- tests/basic/gwbasic/AUTO_dot/DUMPSCRN.BAS | 12 ++++++++ tests/basic/gwbasic/AUTO_dot/PCBASIC.INI | 2 +- tests/basic/gwbasic/AUTO_dot/TEST.BAS | 10 ------- .../basic/gwbasic/AUTO_dot/model/DUMPSCRN.BAS | 12 ++++++++ tests/basic/gwbasic/AUTO_dot/model/OUTPUT.TXT | 28 +++++++++---------- 5 files changed, 39 insertions(+), 25 deletions(-) create mode 100644 tests/basic/gwbasic/AUTO_dot/DUMPSCRN.BAS create mode 100644 tests/basic/gwbasic/AUTO_dot/model/DUMPSCRN.BAS diff --git a/tests/basic/gwbasic/AUTO_dot/DUMPSCRN.BAS b/tests/basic/gwbasic/AUTO_dot/DUMPSCRN.BAS new file mode 100644 index 000000000..d106c922b --- /dev/null +++ b/tests/basic/gwbasic/AUTO_dot/DUMPSCRN.BAS @@ -0,0 +1,12 @@ +10 ' dump text screen to file +1000 N$="output.txt" +1010 DEF SEG=&HB800 +1020 OPEN N$ FOR OUTPUT AS 1 +1030 FOR Y = 0 TO 24 +1040 FOR X = 0 TO 79 +1050 PRINT #1, CHR$(PEEK(2*(Y*80+X))); +1060 NEXT +1065 PRINT #1, "" +1070 NEXT +1080 CLOSE 1 + diff --git a/tests/basic/gwbasic/AUTO_dot/PCBASIC.INI b/tests/basic/gwbasic/AUTO_dot/PCBASIC.INI index 969beecc6..328ad5d62 100644 --- a/tests/basic/gwbasic/AUTO_dot/PCBASIC.INI +++ b/tests/basic/gwbasic/AUTO_dot/PCBASIC.INI @@ -2,4 +2,4 @@ font=default run=TEST.BAS soft-linefeed=True -keys=rem\r\x03list\rrun 1000\rsystem\r +keys=rem\r\x03list\rrun "dumpscrn"\rsystem\r diff --git a/tests/basic/gwbasic/AUTO_dot/TEST.BAS b/tests/basic/gwbasic/AUTO_dot/TEST.BAS index 55ee768b0..b60d7a799 100644 --- a/tests/basic/gwbasic/AUTO_dot/TEST.BAS +++ b/tests/basic/gwbasic/AUTO_dot/TEST.BAS @@ -1,13 +1,3 @@ 20 AUTO . 999 END -1000 N$="output.txt" ' RUN 1000 to dump screen -1010 DEF SEG=&HB800 -1020 OPEN N$ FOR OUTPUT AS 1 -1030 FOR Y = 0 TO 24 -1040 FOR X = 0 TO 79 -1050 PRINT #1, CHR$(PEEK(2*(Y*80+X))); -1060 NEXT -1065 PRINT #1, "" -1070 NEXT -1080 CLOSE 1  diff --git a/tests/basic/gwbasic/AUTO_dot/model/DUMPSCRN.BAS b/tests/basic/gwbasic/AUTO_dot/model/DUMPSCRN.BAS new file mode 100644 index 000000000..d106c922b --- /dev/null +++ b/tests/basic/gwbasic/AUTO_dot/model/DUMPSCRN.BAS @@ -0,0 +1,12 @@ +10 ' dump text screen to file +1000 N$="output.txt" +1010 DEF SEG=&HB800 +1020 OPEN N$ FOR OUTPUT AS 1 +1030 FOR Y = 0 TO 24 +1040 FOR X = 0 TO 79 +1050 PRINT #1, CHR$(PEEK(2*(Y*80+X))); +1060 NEXT +1065 PRINT #1, "" +1070 NEXT +1080 CLOSE 1 + diff --git a/tests/basic/gwbasic/AUTO_dot/model/OUTPUT.TXT b/tests/basic/gwbasic/AUTO_dot/model/OUTPUT.TXT index 7d66c9e89..a6b0e997e 100644 --- a/tests/basic/gwbasic/AUTO_dot/model/OUTPUT.TXT +++ b/tests/basic/gwbasic/AUTO_dot/model/OUTPUT.TXT @@ -1,21 +1,21 @@ -1080*rem -1090 +999*rem +1009 Ok˙ list 20 AUTO . -999 END -1000 N$="output.txt" ' RUN 1000 to dump screen -1010 DEF SEG=&HB800 -1020 OPEN N$ FOR OUTPUT AS 1 -1030 FOR Y = 0 TO 24 -1040 FOR X = 0 TO 79 -1050 PRINT #1, CHR$(PEEK(2*(Y*80+X))); -1060 NEXT -1065 PRINT #1, "" -1070 NEXT -1080 REM +999 REM Ok˙ -run 1000 +run "dumpscrn" + + + + + + + + + + From dd6a88832d609a15fc17653f522caa31e4e5f691 Mon Sep 17 00:00:00 2001 From: Rob Hagemans Date: Sat, 16 Mar 2024 09:49:07 +0000 Subject: [PATCH 4/5] add test for use of dot linenumber (last stored line) on empty program buffer --- .../dot_linenumber_empty_program/DUMPSCRN.BAS | 12 +++++++++ .../dot_linenumber_empty_program/PCBASIC.INI | 4 +++ .../dot_linenumber_empty_program/TEST.BAS | 0 .../model/OUTPUT.TXT | 26 +++++++++++++++++++ 4 files changed, 42 insertions(+) create mode 100644 tests/basic/gwbasic/dot_linenumber_empty_program/DUMPSCRN.BAS create mode 100644 tests/basic/gwbasic/dot_linenumber_empty_program/PCBASIC.INI create mode 100644 tests/basic/gwbasic/dot_linenumber_empty_program/TEST.BAS create mode 100644 tests/basic/gwbasic/dot_linenumber_empty_program/model/OUTPUT.TXT diff --git a/tests/basic/gwbasic/dot_linenumber_empty_program/DUMPSCRN.BAS b/tests/basic/gwbasic/dot_linenumber_empty_program/DUMPSCRN.BAS new file mode 100644 index 000000000..d106c922b --- /dev/null +++ b/tests/basic/gwbasic/dot_linenumber_empty_program/DUMPSCRN.BAS @@ -0,0 +1,12 @@ +10 ' dump text screen to file +1000 N$="output.txt" +1010 DEF SEG=&HB800 +1020 OPEN N$ FOR OUTPUT AS 1 +1030 FOR Y = 0 TO 24 +1040 FOR X = 0 TO 79 +1050 PRINT #1, CHR$(PEEK(2*(Y*80+X))); +1060 NEXT +1065 PRINT #1, "" +1070 NEXT +1080 CLOSE 1 + diff --git a/tests/basic/gwbasic/dot_linenumber_empty_program/PCBASIC.INI b/tests/basic/gwbasic/dot_linenumber_empty_program/PCBASIC.INI new file mode 100644 index 000000000..02387c1de --- /dev/null +++ b/tests/basic/gwbasic/dot_linenumber_empty_program/PCBASIC.INI @@ -0,0 +1,4 @@ +[pcbasic] +font=default +soft-linefeed=True +keys=list .\rrenum .\redit .\rdelete .\rauto .\r\x03run "dumpscrn"\rsystem\r diff --git a/tests/basic/gwbasic/dot_linenumber_empty_program/TEST.BAS b/tests/basic/gwbasic/dot_linenumber_empty_program/TEST.BAS new file mode 100644 index 000000000..e69de29bb diff --git a/tests/basic/gwbasic/dot_linenumber_empty_program/model/OUTPUT.TXT b/tests/basic/gwbasic/dot_linenumber_empty_program/model/OUTPUT.TXT new file mode 100644 index 000000000..3e2ce3b41 --- /dev/null +++ b/tests/basic/gwbasic/dot_linenumber_empty_program/model/OUTPUT.TXT @@ -0,0 +1,26 @@ +Ok˙ +list . +Ok˙ +renum . +Ok˙ +edit . +Undefined line number˙ +Ok˙ +delete . +Illegal function call˙ +Ok˙ +auto . +0 +Ok˙ +run "dumpscrn" + + + + + + + + + + + \ No newline at end of file From fc20cdda65131951a89e5ea804abef588e53eacb Mon Sep 17 00:00:00 2001 From: Rob Hagemans Date: Sat, 16 Mar 2024 12:37:39 +0000 Subject: [PATCH 5/5] do not show broken links in FILES --- pcbasic/basic/devices/disk.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/pcbasic/basic/devices/disk.py b/pcbasic/basic/devices/disk.py index 2739f60f9..22c7ba80a 100644 --- a/pcbasic/basic/devices/disk.py +++ b/pcbasic/basic/devices/disk.py @@ -523,9 +523,14 @@ def _split_pathmask(self, dos_pathmask): def _get_dirs_files(self, native_path): """Get native filenames for native path.""" all_names = safe(os.listdir, native_path) - dirs = [n for n in all_names if os.path.isdir(os.path.join(native_path, n))] - fils = [n for n in all_names if not os.path.isdir(os.path.join(native_path, n))] - return dirs, fils + native_names = [os.path.join(native_path, _name) for _name in all_names] + dirs = [_name for _name in native_names if os.path.isdir(_name)] + files = [ + _name for _name in native_names + if os.path.exists(_name) + and not os.path.isdir(_name) + ] + return dirs, files def listdir(self, pathmask): """Get directory listing."""