Fix a bug in MFORMAT ~M that caused entire lines of text to not print
commitb5df77bd7095ab4905d87f457d81eeba6f505936
authorKris Katterjohn <katterjohn@gmail.com>
Mon, 20 Apr 2020 22:28:43 +0000 (20 17:28 -0500)
committerKris Katterjohn <katterjohn@gmail.com>
Mon, 20 Apr 2020 22:28:43 +0000 (20 17:28 -0500)
tree4364ebb64077db02a4ed285ebddda8989771674d
parent0c3b407a19f93da1554ff7b21f4a22430b83f8f7
Fix a bug in MFORMAT ~M that caused entire lines of text to not print

Since commit 6bcf3cd9 in 2012, the MFORMAT directive ~M would cause
the surrounding line of text to not actually be printed unless the
output stream was standard output:

(%i1) :lisp (mformat t "~M" 1)
1
NIL

(%i1) :lisp (prin1 (with-output-to-string (s) (mformat s "~M" 1)))
""

(%i1) :lisp (eq *standard-output* *terminal-io*)
NIL

(%i1) :lisp (mformat t "oops ~M bar~%baz" 'foo)
oops foo bar
baz
NIL

(%i1) :lisp (mformat *terminal-io* "oops ~A bar~%baz" 'foo)
oops foo bar
baz
NIL

(%i1) :lisp (mformat *terminal-io* "oops ~M bar~%baz" 'foo)
baz
NIL

(Actually if the colon modifier for ~M was used then this worked; the
at-sign modifier had no effect on this.)

In DISPLAF, if the stream to print to is not standard output then
*STANDARD-OUTPUT* is bound to the stream before calling DISPLA.  Prior
to commit 6bcf3cd9 both ^R and ^W were both bound to T in DISPLAF and
they were both checked in DISPLA: if ^W was NIL or ^R was non-NIL then
DISPLA would print to standard output.  In that commit ^R was removed
and the ^R check in DISPLA was dropped, and this caused DISPLA to not
print anything in the case where the stream passed to DISPLAF was not
standard output because only ^W was checked and it was non-NIL.

I'm fixing this bug by binding ^W to NIL in DISPLAF instead of T.  This
is not just a quick hack: since DISPLAF is rebinding *STANDARD-OUTPUT*
to the stream to print to, it makes sense to bind ^W to NIL since ^W
controls the printing to standard output.

In Macsyma under Maclisp, before calling DISPLA in DISPLAF both ^R and
^W were bound to T and OUTFILES was bound to a singleton list holding
the file object to print to.  This all made sense because this setup
made it so the output went to the file and not the terminal.  After the
change for Common Lisp where *STANDARD-OUTPUT* was bound instead of
OUTFILES, binding ^W to T didn't really make sense anymore (but it all
worked out for DISPLAF at that time because ^R was also bound to T).

There are places in Maxima (such as the translator) where MFORMAT is
used for printing to streams that are not standard output.
src/mformt.lisp