grunwald@flute.cs.uiuc.edu (Dirk Grunwald) (05/31/89)
This comes in handy when unpacking shar files from within emacs.
;;
;; unshar.el -- unpack `shar' files under Emacs.
;;
;; Copyright (C) 1989 Free Software Foundation, if they want it.
;; 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.
;;
;; Author Dirk C. Grunwald (grunwald@flute.cs.uiuc.edu)
;;
(defun unshar-current-word ()
"Word next word."
(save-excursion
(let
( beg end )
;;
;; Skip over white space
(if (looking-at "[ ]")
(re-search-forward "[ $]" nil t) )
;;
;; Skip to next white space
;;
(if (not (re-search-forward "[ $]" nil t) )
(end-of-buffer))
(re-search-backward "[^ $]" nil t)
(setq beg (point))
;;
;; Skip to next white space
;;
(re-search-backward "[ ]")
(if (looking-at "[ ]")
(re-search-forward "[ $]" nil t) )
(setq end (point))
(buffer-substring beg end))))
;;
;; Call a unix process and display the output in a buffer
;;
;;
(defvar unshar-info-buffer "*Unshar Info*"
"Buffer name of user information")
;;
;; Unshar a file from within emacs, eliminating any preceeding junk
;;
(defun unshar (filename)
(interactive (list
(read-string "Unshar: "
(concat default-directory
(unshar-current-word)))))
(let*
((make-backup-files nil)
(full-name (expand-file-name filename))
(temp-name (make-temp-name "/tmp/unshar"))
(temp-buff (get-file-buffer temp-name)))
;;
;; copy the file into another buffer
;; (we'll be killing parts of the original file)
;;
(cd default-directory)
(if temp-buff (kill-buffer temp-buff))
(if (file-exists-p temp-name)
(delete-file temp-name))
;;
;; make the temp file be the current buffer, don't display it
;;
(find-file-noselect temp-name)
(set-buffer (get-file-buffer temp-name))
(if buffer-read-only
(toggle-read-only))
(delete-region (point-min) (point-max))
(goto-char (point-min))
(insert-file full-name)
(re-search-forward "^#" nil 2)
(backward-char 1)
(unwind-protect
(if (eobp)
(message "I don't think this is a shar file.")
(let ((shell-name (if (looking-at "#!/bin/csh")
"/bin/csh"
"/bin/sh")))
(if (not (bobp))
(progn
(delete-region (point) (point-min))
(write-file temp-name)))
;;
;; now, run the shell to unshar the file
;;
(if (get-buffer unshar-info-buffer)
(kill-buffer unshar-info-buffer))
(save-excursion
(set-buffer (get-buffer-create unshar-info-buffer))
(let
((default-directory (file-name-directory full-name)))
(cd default-directory)
(insert (concat "Unsharing file " temp-name " in directory "
default-directory "\n"))
(display-buffer unshar-info-buffer)
(call-process shell-name nil unshar-info-buffer t temp-name)
(goto-char (point-min)))))))
(kill-buffer (current-buffer))
(delete-file temp-name)))
--
Dirk Grunwald
Univ. of Illinois
grunwald@flute.cs.uiuc.edugrunwald@flute.cs.uiuc.edu (Dirk Grunwald) (05/31/89)
Some people got two copies of this; the later one is correct. A cancel should arrive soon & blast the old one. -- Dirk Grunwald Univ. of Illinois grunwald@flute.cs.uiuc.edu