update.
[elisp/apel.git] / filename.el
index 34853fb..bbe1f9a 100644 (file)
@@ -1,12 +1,12 @@
 ;;; filename.el --- file name filter
 
-;; Copyright (C) 1996 MORIOKA Tomohiko
+;; Copyright (C) 1996,1997 MORIOKA Tomohiko
 
 ;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
-;; Version: $Id: filename.el,v 1.1 1996/12/16 13:42:14 morioka Exp $
-;; Keywords: string, file name
+;; Version: $Id: filename.el,v 2.1 1997/11/06 15:50:53 morioka Exp $
+;; Keywords: file name, string
 
-;; This file is part of tl (Tiny Library).
+;; This file is part of APEL (A Portable Emacs Library).
 
 ;; This program is free software; you can redistribute it and/or
 ;; modify it under the terms of the GNU General Public License as
 
 ;;; Code:
 
-(require 'tl-list)
-(require 'tl-str)
+(require 'emu)                         ; for backward compatibility.
+(require 'poe)                         ; functionp.
+(require 'poem)                                ; char-int, and char-length.
+(require 'path-util)
+
+(defsubst poly-funcall (functions argument)
+  "Apply initial ARGUMENT to sequence of FUNCTIONS.
+FUNCTIONS is list of functions.
+
+(poly-funcall '(f1 f2 .. fn) arg) is as same as
+(fn .. (f2 (f1 arg)) ..).
+
+For example, (poly-funcall '(car number-to-string) '(100)) returns
+\"100\"."
+  (while functions
+    (setq argument (funcall (car functions) argument)
+         functions (cdr functions)))
+  argument)
 
 
 ;;; @ variables
 ;;;
 
-(defvar filename-limit-length 21)
+(defvar filename-limit-length 21 "Limit size of file-name.")
 
 (defvar filename-replacement-alist
-  (list
-   (cons (string-to-char-list " \t") "_")
-   (cons (string-to-char-list (expand-char-ranges "!-*,/:;<>?[-^`{-~")) "_")
-   '(filename-control-p . "")
-   ))
+  '(((?\  ?\t) . "_")
+    ((?! ?\" ?# ?$ ?% ?& ?' ?\( ?\) ?* ?/
+        ?: ?\; ?< ?> ?? ?\[ ?\\ ?\] ?` ?{ ?| ?}) . "_")
+    (filename-control-p . ""))
+  "Alist list of characters vs. string as replacement.
+List of characters represents characters not allowed as file-name.")
 
 (defvar filename-filters
-  (nconc
-   (and (file-installed-p "kakasi" exec-path)
-       '(filename-japanese-to-roman-string)
-       )
-   '(filename-special-filter
-     filename-eliminate-top-low-lines
-     filename-canonicalize-low-lines
-     filename-maybe-truncate-by-size
-     filename-eliminate-bottom-low-lines
-     )))
+  (let ((filters '(filename-special-filter
+                  filename-eliminate-top-low-lines
+                  filename-canonicalize-low-lines
+                  filename-maybe-truncate-by-size
+                  filename-eliminate-bottom-low-lines
+                  )))
+    (if (exec-installed-p "kakasi")
+       (cons 'filename-japanese-to-roman-string filters)
+      filters))
+  "List of functions for file-name filter.")
 
 
 ;;; @ filters
     (set-buffer (get-buffer-create " *temp kakasi*"))
     (erase-buffer)
     (insert str)
-    (call-process-region (point-min)(point-max) "kakasi" t t t
-                        "-Ha" "-Ka" "-Ja" "-Ea" "-ka")
-    (buffer-string)
-    ))
+    (call-process-region
+     (point-min)(point-max)
+     "kakasi" t t t "-Ha" "-Ka" "-Ja" "-Ea" "-ka")
+    (buffer-string)))
 
 (defun filename-control-p (character)
   (let ((code (char-int character)))
-    (or (< code 32)(= code 127))
-    ))
+    (or (< code 32)(= code 127))))
 
 (defun filename-special-filter (string)
-  (let (dest
-       (i 0)
-       (len (length string))
-       (b 0)
-       )
+  (let ((len (length string))
+       (b 0)(i 0)
+       (dest ""))
     (while (< i len)
-      (let* ((chr (sref string i))
-            (ret (ASSOC chr filename-replacement-alist
-                        :test (function
-                               (lambda (chr key)
-                                 (if (functionp key)
-                                     (funcall key chr)
-                                   (memq chr key)
-                                   )
-                                 ))))
-            )
+      (let ((chr (sref string i))
+            (lst filename-replacement-alist)
+            ret)
+        (while (and lst (not ret))
+          (if (if (functionp (car (car lst)))
+                  (setq ret (funcall (car (car lst)) chr))
+                (setq ret (memq chr (car (car lst)))))
+              t                         ; quit this loop.
+            (setq lst (cdr lst))))
        (if ret
-           (setq dest (concat dest (substring string b i)(cdr ret))
+           (setq dest (concat dest (substring string b i)(cdr (car lst)))
                  i (+ i (char-length chr))
                  b i)
-         (setq i (+ i (char-length chr)))
-         )))
-    (concat dest (substring string b))
-    ))
+         (setq i (+ i (char-length chr))))))
+    (concat dest (substring string b))))
 
 (defun filename-eliminate-top-low-lines (string)
   (if (string-match "^_+" string)
     string))
 
 (defun filename-canonicalize-low-lines (string)
-  (let (dest)
+  (let ((dest ""))
     (while (string-match "__+" string)
       (setq dest (concat dest (substring string 0 (1+ (match-beginning 0)))))
-      (setq string (substring string (match-end 0)))
-      )
-    (concat dest string)
-    ))
+      (setq string (substring string (match-end 0))))
+    (concat dest string)))
 
 (defun filename-maybe-truncate-by-size (string)
   (if (and (> (length string) filename-limit-length)
-          (string-match "_" string filename-limit-length)
-          )
+          (string-match "_" string filename-limit-length))
       (substring string 0 (match-beginning 0))
     string))
 
 ;;;
 
 (defun replace-as-filename (string)
-  "Return safety filename from STRING. [filename.el]"
-  (poly-funcall filename-filters string)
-  )
+  "Return safety filename from STRING.
+It refers variable `filename-filters' and default filters refers
+`filename-limit-length', `filename-replacement-alist'."
+  (and string
+       (poly-funcall filename-filters string)))
 
 
 ;;; @ end
 ;;;
 
-(provide 'filename)
+(require 'product)
+(product-provide (provide 'filename) (require 'apel-ver))
 
 ;;; filename.el ends here