diff lisp/efs/efs-ms-unix.el @ 22:8fc7fe29b841 r19-15b94

Import from CVS: tag r19-15b94
author cvs
date Mon, 13 Aug 2007 08:50:29 +0200
parents
children 8b8b7f3559a2 8619ce7e4c50
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/efs/efs-ms-unix.el	Mon Aug 13 08:50:29 2007 +0200
@@ -0,0 +1,165 @@
+;; -*-Emacs-Lisp-*-
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; File:         efs-ms-unix.el
+;; Release:      $efs release: 1.15 $
+;; Version:      $Revision: 1.1 $
+;; RCS:          
+;; Description:  efs support for the Microsoft PC FTP server in unix mode.
+;; Author:       Sandy Rutherford <sandy@tsmi19.sissa.it>
+;; Created:      Thu Aug 19 08:31:15 1993 by sandy on ibm550
+;; Modified:     Sun Nov 27 18:37:00 1994 by sandy on gandalf
+;; Language:     Emacs-Lisp
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(provide 'efs-ms-unix)
+(require 'efs)
+
+(defconst efs-ms-unix-version
+  (concat (substring "$efs release: 1.15 $" 14 -2)
+	  "/"
+	  (substring "$Revision: 1.1 $" 11 -2)))
+
+(defvar efs-ms-unix-month-and-time-regexp
+  (concat
+   " \\([0-9]+\\) +" ; file size
+   "\\(Jan\\|Feb\\|Mar\\|Apr\\|May\\|Jun\\|Jul\\|Aug\\|Sep\\|Oct"
+   "\\|Nov\\|Dec\\) [ 0-3][0-9]"
+   " +\\([ 012][0-9]:[0-6][0-9]\\|[12][90][0-9][0-9]\\) +"))
+
+;;; entry points
+
+(efs-defun efs-fix-path ms-unix (path &optional reverse)
+  ;; Convert PATH from UNIX-ish to MS-UNIX.
+  (if reverse
+      (concat "/" path)
+    (substring path 1)))
+
+(efs-defun efs-fix-dir-path ms-unix (dirpath)
+  ;; Convert a path from UNIX-ish to MS-UNIX for a dir listing
+  (if (string-equal dirpath "/")
+      (error "Cannot grok disk names.")
+    (setq dirpath (substring dirpath 1))
+    (efs-save-match-data
+      (if (string-match "/$" dirpath)
+	  (concat dirpath "*")
+	dirpath))))
+
+(defmacro efs-ms-unix-parse-file-line ()
+  ;; Extract the filename, size, and permission string from the current
+  ;; line of a dired-like listing. Assumes that the point is at
+  ;; the beginning of the line, leaves it just before the size entry.
+  ;; Returns a list (name size perm-string nlinks owner).
+  ;; If there is no file on the line, returns nil.
+  (` (let ((eol (save-excursion (end-of-line) (point)))
+	   name size modes nlinks owner)
+       (skip-chars-forward " 0-9" eol)
+       (and
+	(looking-at efs-modes-links-owner-regexp)
+	(setq modes (buffer-substring (match-beginning 1)
+				      (match-end 1))
+	      nlinks (string-to-int (buffer-substring (match-beginning 2)
+						      (match-end 2)))
+	      owner (buffer-substring (match-beginning 3) (match-end 3)))
+	(re-search-forward efs-ms-unix-month-and-time-regexp eol t)
+	(setq name (buffer-substring (point) eol)
+	      size (string-to-int (buffer-substring (match-beginning 1)
+						    (match-end 1))))
+	(list name size modes nlinks owner)))))
+
+(efs-defun efs-parse-listing ms-unix (host user dir path &optional switches)
+  ;; Parse the current buffer which is assumed to be output from
+  ;; the Microsoft FTP server in unix mode.
+  ;; Return a hashtable as the result. SWITCHES are never used,
+  ;; but they must be specified in the argument list for compatibility
+  ;; with the unix version of this function.
+  ;; HOST = remote host name
+  ;; USER = user name
+  ;; DIR = directory in as a full remote path
+  ;; PATH = directory in full efs path syntax
+  ;; SWITCHES = ls switches
+  (goto-char (point-min))
+  (efs-save-match-data
+    (if (re-search-forward efs-ms-unix-month-and-time-regexp nil t)
+	(let ((tbl (efs-make-hashtable))
+	      size modes nlinks dir-p owner file)
+	  (beginning-of-line)
+	  (while (setq file (efs-ms-unix-parse-file-line))
+	    (setq size (nth 1 file)
+		  modes (nth 2 file)
+		  nlinks (nth 3 file)
+		  owner (nth 4 file)
+		  file (car file)
+		  dir-p (= (string-to-char modes) ?d))
+	    (if (and dir-p
+		     (string-match "/$" file))
+		(setq file (substring file 0 -1)))
+	    (efs-put-hash-entry file (list dir-p size owner modes nlinks) tbl)
+	    (forward-line 1))
+	  (efs-put-hash-entry "." '(t) tbl)
+	  (efs-put-hash-entry ".." '(t) tbl)
+	  tbl))))
+
+;;; Tree Dired
+
+;; ms-unix does not have a total line
+
+(efs-defun efs-dired-insert-headerline ms-unix (dir)
+  ;; MTS has no total line, so we insert a blank line for
+  ;; aesthetics.
+  (insert "\n")
+  (forward-char -1)
+  (efs-real-dired-insert-headerline dir))
+
+(efs-defun efs-dired-manual-move-to-filename ms-unix
+  (&optional raise-error bol eol)
+  ;; In dired, move to the first char of filename on this line.
+  ;; Returns (point) or nil if raise-error is nil, and there is no
+  ;; no filename on this line.
+  ;; This version is for ms-unix.
+  (or eol (setq eol (save-excursion (skip-chars-forward "^\r\n") (point))))
+  (let (case-fold-search)
+    (if bol
+	(goto-char bol)
+      (skip-chars-backward "^\n\r")
+      (setq bol (point)))
+    (if (re-search-forward efs-ms-unix-month-and-time-regexp eol t)
+	(point)
+      (and raise-error (error "No file on this line")))))
+
+(efs-defun efs-dired-manual-move-to-end-of-filename ms-unix
+  (&optional no-error bol eol)
+  ;; Assumes point is at the beginning of filename.
+  ;; So, it should be called only after (dired-move-to-filename t)
+  ;; On failure signals an error, or returns nil.
+  ;; This is the ms-unix version.
+  (let ((opoint (point)))
+    (and selective-display
+	 (null no-error)
+	 (eq (char-after
+	      (1- (or bol (save-excursion
+			    (skip-chars-backward "^\r\n")
+			    (point)))))
+	     ?\r)
+	 ;; File is hidden or omitted.
+	 (cond
+	  ((dired-subdir-hidden-p (dired-current-directory))
+	   (error
+	    (substitute-command-keys
+	     "File line is hidden. Type \\[dired-hide-subdir] to unhide.")))
+	  ((error
+	   (substitute-command-keys
+	    "File line is omitted. Type \\[dired-omit-toggle] to un-omit.")))))
+    (if (eolp)
+	(progn
+	  (goto-char opoint)
+	  (if no-error
+	      nil
+	    (error "No file on this line")))
+      (end-of-line)
+      (if (char-equal (preceding-char) ?/)
+	  (forward-char -1))
+      (point))))
+
+;;; end of efs-ms-unix.el