* emu-e20.el (ccl-use-symbol-as-program): Use
[elisp/apel.git] / emu-18.el
index 9d20e8d..8ee121a 100644 (file)
--- a/emu-18.el
+++ b/emu-18.el
@@ -1,10 +1,50 @@
+;;; emu-18.el --- emu API implementation for Emacs 18.*
+
+;; Copyright (C) 1995,1996,1997 Free Software Foundation, Inc.
+
+;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
+;; Version: $Id: emu-18.el,v 7.33 1997/04/05 06:44:01 morioka Exp $
+;; Keywords: emulation, compatibility
+
+;; This file is part of emu.
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2, or (at
+;; your option) any later version.
+
+;; This program is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Code:
+
+(autoload 'setenv "env"
+  "Set the value of the environment variable named VARIABLE to VALUE.
+VARIABLE should be a string.  VALUE is optional; if not provided or is
+`nil', the environment variable VARIABLE will be removed.  
+This function works by modifying `process-environment'."
+  t)
+
+(defvar data-directory exec-directory)
+
+
+;;; @ for EMACS 18.55
 ;;;
-;;; emu-18: Emacs 19.* emulation module for Emacs 18.*
-;;;
-;;; $Id: emu-18.el,v 3.0 1995/08/26 18:07:06 morioka Exp $
+
+(defvar buffer-undo-list nil)
+
+
+;;; @ hook
 ;;;
 
-;; This function is imported from AUC TeX.
+;; These function are imported from EMACS 19.28.
 (defun add-hook (hook function &optional append)
   "Add to the value of HOOK the function FUNCTION.
 FUNCTION is not added if already present.
@@ -15,7 +55,7 @@ FUNCTION is added at the end.
 HOOK should be a symbol, and FUNCTION may be any valid function.  If
 HOOK is void, it is first set to nil.  If HOOK's value is a single
 function, it is changed to a list of functions.
-\[emu-18 Emacs 19 emulating function]"
+\[emu-18.el; EMACS 19 emulating function]"
   (or (boundp hook)
       (set hook nil)
       )
@@ -40,19 +80,306 @@ function, it is changed to a list of functions.
             ))
       ))
 
+(defun remove-hook (hook function)
+  "Remove from the value of HOOK the function FUNCTION.
+HOOK should be a symbol, and FUNCTION may be any valid function.  If
+FUNCTION isn't the value of HOOK, or, if FUNCTION doesn't appear in the
+list of hooks to run in HOOK, then nothing is done.  See `add-hook'.
+\[emu-18.el; EMACS 19 emulating function]"
+  (if (or (not (boundp hook))          ;unbound symbol, or
+         (null (symbol-value hook))    ;value is nil, or
+         (null function))              ;function is nil, then
+      nil                              ;Do nothing.
+    (let ((hook-value (symbol-value hook)))
+      (if (consp hook-value)
+         (setq hook-value (delete function hook-value))
+       (if (equal hook-value function)
+           (setq hook-value nil)
+         ))
+      (set hook hook-value)
+      )))
+
+
+;;; @ list
+;;;
+
 (defun member (elt list)
   "Return non-nil if ELT is an element of LIST.  Comparison done with EQUAL.
 The value is actually the tail of LIST whose car is ELT.
-\[emu-18 Emacs 19 emulating function]"
+\[emu-18.el; EMACS 19 emulating function]"
   (while (and list (not (equal elt (car list))))
     (setq list (cdr list)))
   list)
 
-(defun defalias (SYM NEWDEF)
+(defun delete (elt list)
+  "Delete by side effect any occurrences of ELT as a member of LIST.
+The modified LIST is returned.  Comparison is done with `equal'.
+If the first member of LIST is ELT, deleting it is not a side effect;
+it is simply using a different list.
+Therefore, write `(setq foo (delete element foo))'
+to be sure of changing the value of `foo'.
+\[emu-18.el; EMACS 19 emulating function]"
+  (if (equal elt (car list))
+      (cdr list)
+    (let ((rest list)
+         (rrest (cdr list))
+         )
+      (while (and rrest (not (equal elt (car rrest))))
+       (setq rest rrest
+             rrest (cdr rrest))
+       )
+      (rplacd rest (cdr rrest))
+      list)))
+
+
+;;; @ function
+;;;
+
+(defun defalias (sym newdef)
   "Set SYMBOL's function definition to NEWVAL, and return NEWVAL.
 Associates the function with the current load file, if any.
-\[emu-18 Emacs 19 emulating function]"
-  (fset SYM (symbol-function NEWDEF))
-  NEWDEF)
+\[emu-18.el; EMACS 19 emulating function]"
+  (fset sym newdef)
+  )
+
+(defun byte-code-function-p (exp)
+  "T if OBJECT is a byte-compiled function object.
+\[emu-18.el; EMACS 19 emulating function]"
+  (and (consp exp)
+       (let* ((rest (cdr (cdr exp))) elt)
+        (if (stringp (car rest))
+            (setq rest (cdr rest))
+          )
+        (catch 'tag
+          (while rest
+            (setq elt (car rest))
+            (if (and (consp elt)(eq (car elt) 'byte-code))
+                (throw 'tag t)
+              )
+            (setq rest (cdr rest))
+            ))
+        )))
+
+(defmacro-maybe defsubst (name arglist &rest body)
+  "Define an inline function.  The syntax is just like that of `defun'."
+  (cons 'defun (cons name (cons arglist body)))
+  )
+
+
+;;; @ file
+;;;
+
+(defun make-directory-internal (dirname)
+  "Create a directory. One argument, a file name string.
+\[emu-18.el; EMACS 19 emulating function]"
+  (if (file-exists-p dirname)
+      (error "Creating directory: %s is already exist" dirname)
+    (if (not (= (call-process "mkdir" nil nil nil dirname) 0))
+       (error "Creating directory: no such file or directory, %s" dirname)
+      )))
+
+(defun make-directory (dir &optional parents)
+  "Create the directory DIR and any nonexistent parent dirs.
+The second (optional) argument PARENTS says whether
+to create parent directories if they don't exist.
+\[emu-18.el; EMACS 19 emulating function]"
+  (let ((len (length dir))
+       (p 0) p1 path)
+    (catch 'tag
+      (while (and (< p len) (string-match "[^/]*/?" dir p))
+       (setq p1 (match-end 0))
+       (if (= p1 len)
+           (throw 'tag nil)
+         )
+       (setq path (substring dir 0 p1))
+       (if (not (file-directory-p path))
+           (cond ((file-exists-p path)
+                  (error "Creating directory: %s is not directory" path)
+                  )
+                 ((null parents)
+                  (error "Creating directory: %s is not exist" path)
+                  )
+                 (t
+                  (make-directory-internal path)
+                  ))
+         )
+       (setq p p1)
+       ))
+    (make-directory-internal dir)
+    ))
+
+;; Imported from files.el of EMACS 19.33.
+(defun parse-colon-path (cd-path)
+  "Explode a colon-separated list of paths into a string list."
+  (and cd-path
+       (let (cd-prefix cd-list (cd-start 0) cd-colon)
+        (setq cd-path (concat cd-path path-separator))
+        (while (setq cd-colon (string-match path-separator cd-path cd-start))
+          (setq cd-list
+                (nconc cd-list
+                       (list (if (= cd-start cd-colon)
+                                  nil
+                               (substitute-in-file-name
+                                (file-name-as-directory
+                                 (substring cd-path cd-start cd-colon)))))))
+          (setq cd-start (+ cd-colon 1)))
+        cd-list)))
+
+;; Imported from files.el of EMACS 19.33.
+(defun file-relative-name (filename &optional directory)
+  "Convert FILENAME to be relative to DIRECTORY (default: default-directory)."
+  (setq filename (expand-file-name filename)
+       directory (file-name-as-directory (expand-file-name
+                                          (or directory default-directory))))
+  (let ((ancestor ""))
+    (while (not (string-match (concat "^" (regexp-quote directory)) filename))
+      (setq directory (file-name-directory (substring directory 0 -1))
+           ancestor (concat "../" ancestor)))
+    (concat ancestor (substring filename (match-end 0)))))
+
+(or (fboundp 'si:directory-files)
+    (fset 'si:directory-files (symbol-function 'directory-files)))
+(defun directory-files (directory &optional full match nosort)
+  "Return a list of names of files in DIRECTORY.
+There are three optional arguments:
+If FULL is non-nil, return absolute file names.  Otherwise return names
+ that are relative to the specified directory.
+If MATCH is non-nil, mention only file names that match the regexp MATCH.
+If NOSORT is dummy for compatibility.
+\[emu-18.el; EMACS 19 emulating function]"
+  (si:directory-files directory full match)
+  )
+
+    
+;;; @ mark
+;;;
+
+(or (fboundp 'si:mark)
+    (fset 'si:mark (symbol-function 'mark)))
+(defun mark (&optional force)
+  (si:mark)
+  )
+
+
+;;; @ mode-line
+;;;
+
+;;; Imported from Emacs 19.30.
+(defun force-mode-line-update (&optional all)
+  "Force the mode-line of the current buffer to be redisplayed.
+With optional non-nil ALL, force redisplay of all mode-lines.
+\[emu-18.el; Emacs 19 emulating function]"
+  (if all (save-excursion (set-buffer (other-buffer))))
+  (set-buffer-modified-p (buffer-modified-p)))
+
+
+;;; @ overlay
+;;;
+
+(defun overlay-buffer (overlay))
+
+
+;;; @ text property
+;;;
+
+(defun remove-text-properties (start end properties &optional object))
+
+
+;;; @@ visible/invisible
+;;;
+
+(defmacro enable-invisible ()
+  (`
+   (progn
+     (make-local-variable 'original-selective-display)
+     (setq original-selective-display selective-display)
+     (setq selective-display t)
+     )))
+
+(defmacro end-of-invisible ()
+  (` (setq selective-display
+          (if (boundp 'original-selective-display)
+              original-selective-display))
+     ))
+
+(defun invisible-region (start end)
+  (let ((buffer-read-only nil)         ;Okay even if write protected.
+       (modp (buffer-modified-p)))
+    (if (save-excursion
+         (goto-char (1- end))
+         (eq (following-char) ?\n)
+         )
+       (setq end (1- end))
+      )
+    (unwind-protect
+        (subst-char-in-region start end ?\n ?\^M t)
+      (set-buffer-modified-p modp)
+      )))
+
+(defun visible-region (start end)
+  (let ((buffer-read-only nil)         ;Okay even if write protected.
+       (modp (buffer-modified-p)))
+    (unwind-protect
+        (subst-char-in-region start end ?\^M ?\n t)
+      (set-buffer-modified-p modp)
+      )))
+
+(defun invisible-p (pos)
+  (save-excursion
+    (goto-char pos)
+    (eq (following-char) ?\^M)
+    ))
+
+(defun next-visible-point (pos)
+  (save-excursion
+    (goto-char pos)
+    (end-of-line)
+    (if (eq (following-char) ?\n)
+       (forward-char)
+      )
+    (point)
+    ))
+
+
+;;; @ mouse
+;;;
+
+(defvar mouse-button-1 nil)
+(defvar mouse-button-2 nil)
+(defvar mouse-button-3 nil)
+
+
+;;; @ string
+;;;
+
+(defun char-list-to-string (char-list)
+  "Convert list of character CHAR-LIST to string. [emu-18.el]"
+  (mapconcat (function char-to-string) char-list "")
+  )
+
+
+;;; @ buffer
+;;;
+
+(defun-maybe generate-new-buffer-name (name &optional ignore)
+  "Return a string that is the name of no existing buffer based on NAME.
+If there is no live buffer named NAME, then return NAME.
+Otherwise modify name by appending `<NUMBER>', incrementing NUMBER
+until an unused name is found, and then return that name.
+Optional second argument IGNORE specifies a name that is okay to use
+\(if it is in the sequence to be tried)
+even if a buffer with that name exists."
+  (if (get-buffer name)
+      (let ((n 2) new)
+       (while (get-buffer (setq new (format "%s<%d>" name n)))
+         (setq n (1+ n)))
+       new)
+    name))
+
+
+;;; @ end
+;;;
 
 (provide 'emu-18)
+
+;;; emu-18.el ends here