[gnu.emacs.bug] lpr.el fix for xenix, maybe for usg too

warren@UUNET.UU.NET (06/13/89)

I am using Emacs 18.52 on Xenix 386 2.3.1.  M-x lpr-buffer didn't print
anything, so I took a look into lpr.el and found that lpr-command was
being defined as "lpr" because system-type was not equal to
'usr-unix-v (it is 'xenix by me).  That's ok, because on xenix lpr is
a symbolic link to lp.  But what's not ok is that lpr is being called
with -J and -T arguments.  This causes lpr (or lp for that matter) to
print a message (which is not displayed because call-process-region
has BUFFER set to nil) and to terminate without printing.

I suspect that people may be having similar problems on other system
V's, "Portable C and UNIX System Programming" by "J.E. Lapin" says
that -J and -T are only supported on BSD4.2.

The following is my update to lpr.el which works for me.  It uses lp
on xenix (sounds better to me, xenix is more usg-ish than
berkeley-ish) and does not use the -J and -T if lp is used, instead it
uses '-tnmame' (causes the name to appear in the banner page) which
should be checked to see if it works on all usg's because the
"Portable" book doesn't mention it.  I think it does exist, I looked
in a printout of a usg source of lp from several years ago and it has it.

My changes are surrounded by comments
; start change by WB
; end change by WB

print-region and print-buffer still don't work because lp doesn't
recognize -p.  If you answer two quick questions I'll do that, too:

1) is the correct way to get call-proccess-region to pipe pr thru lp
to set PROGRAM to "sh" and pass it args "-c pr | lp"? (I know this
works, but is there a way to pipe within emacs w/o using an extra shell?)

2) Do you have a delete-from-list or some such function to make it
easier to get the -p out of switches?  I'm sure I could write the lisp
for this in less than an entire morning but not by much, I'm not all
that much of a lisp hacker and there's no elisp manual yet. (is that
still the case?  I'm not complaining, just justifying my asking
instead of reading the manual)
-------------
;; Print Emacs buffer on line printer.
;; Copyright (C) 1985, 1988 Free Software Foundation, Inc.

;; This file is part of GNU Emacs.

;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY.  No author or distributor
;; accepts responsibility to anyone for the consequences of using it
;; or for whether it serves any particular purpose or works at all,
;; unless he says so in writing.  Refer to the GNU Emacs General Public
;; License for full details.

;; Everyone is granted permission to copy, modify and redistribute
;; GNU Emacs, but only under the conditions described in the
;; GNU Emacs General Public License.   A copy of this license is
;; supposed to have been given to you along with GNU Emacs so you
;; can know your rights and responsibilities.  It should be in a
;; file named COPYING.  Among other things, the copyright notice
;; and this notice must be preserved on all copies.


;(defconst lpr-switches nil
;  "*List of strings to pass as extra switch args to lpr when it is invoked.")

(defvar lpr-command (if
; start change by WB
			(or
			 (eq system-type 'usg-unix-v)
			 (eq system-type 'xenix))
			"lp" "lpr")
; end change by WB
  "Shell command for printing a file")

(defvar lpr-args (cond
		     ((eq system-type 'usg-unix-v) "lp")
		     ((eq system-type 'xenix) "lp")
		     (t "lpr"))
  "Shell command for printing a file")

(defun lpr-buffer ()
  "Print buffer contents as with Unix command `lpr'.
`lpr-switches' is a list of extra switches (strings) to pass to lpr."
  (interactive)
  (print-region-1 (point-min) (point-max) lpr-switches))

(defun print-buffer ()
  "Print buffer contents as with Unix command `lpr -p'.
`lpr-switches' is a list of extra switches (strings) to pass to lpr."
  (interactive)
  (print-region-1 (point-min) (point-max) (cons "-p" lpr-switches)))

(defun lpr-region (start end)
  "Print region contents as with Unix command `lpr'.
`lpr-switches' is a list of extra switches (strings) to pass to lpr."
  (interactive "r")
  (print-region-1 start end lpr-switches))

(defun print-region (start end)
  "Print region contents as with Unix command `lpr -p'.
`lpr-switches' is a list of extra switches (strings) to pass to lpr."
  (interactive "r")
  (print-region-1 start end (cons "-p" lpr-switches)))

(defun print-region-1 (start end switches)
  (let ((name (concat (buffer-name) " Emacs buffer"))
	(width tab-width))
    (save-excursion
     (message "Spooling...")
     (if (/= tab-width 8)
	 (let ((oldbuf (current-buffer)))
	  (set-buffer (get-buffer-create " *spool temp*"))
	  (widen) (erase-buffer)
	  (insert-buffer-substring oldbuf)
	  (setq tab-width width)
	  (untabify (point-min) (point-max))
	  (setq start (point-min) end (point-max))))
     (apply 'call-process-region
; start change by WB
	    (nconc (list start end lpr-command nil nil nil)
		   (if
		       (eq lpr-command "lpr")
		     (list "-J" name "-T" name)
		     (list (concat "-t" name)))
; end change by WB
		   switches))
     (message "Spooling...done"))))