diff lisp/efs/efs-dos-distinct.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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/efs/efs-dos-distinct.el	Mon Aug 13 08:50:29 2007 +0200
@@ -0,0 +1,152 @@
+;; -*-Emacs-Lisp-*-
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; File:         efs-dos-distinct.el
+;; Release:      $efs release: 1.15 $
+;; Version:      $Revision: 1.1 $
+;; RCS:          
+;; Description:  Distinct's DOS FTP server support for efs
+;; Author:       Sandy Rutherford <sandy@tsmi19.sissa.it>
+;; Created:      Fri Jan 15 22:20:32 1993 by sandy on ibm550
+;; Modified:     Sun Nov 27 18:30:04 1994 by sandy on gandalf
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;; This file is part of efs. See efs.el for copyright
+;;; (it's copylefted) and warrranty (there isn't one) information.
+
+;;; Thanks to Rodd Zurcher <rbz@hook.corp.mot.com> for beta testing.
+
+(provide 'efs-dos-distinct)
+(require 'efs)
+
+(defconst efs-dos-distinct-version
+  (concat (substring "$efs release: 1.15 $" 14 -2)
+	  "/"
+	  (substring "$Revision: 1.1 $" 11 -2)))
+
+;;;; -----------------------------------------------------------------
+;;;; Distinct's DOS FTP server support for efs
+;;;; -----------------------------------------------------------------
+
+;;; This is not included in efs-dos.el with the support for the
+;;; other dos ftp servers, because the Distinct server uses unix syntax
+;;; for path names.
+
+;; This is defined in efs.el, but we put it here too.
+
+(defconst efs-dos-distinct-date-and-time-regexp
+  (concat
+   " \\(Jan\\|Feb\\|Mar\\|Apr\\|May\\|Jun\\|Jul\\|Aug\\|Sep\\|Oct"
+   "\\|Nov\\|Dec\\) [ 0-3][0-9],[12][90][0-9][0-9]  "
+   "[ 12][0-9]:[0-5][0-9]  "))
+
+;;; entry point
+
+(efs-defun efs-parse-listing dos-distinct
+  (host user dir path &optional switches)
+  ;; Parse the current buffer which is assumed to be a listing from
+  ;; Distinct's DOS FTP server. Both empty dirs, and ls errors return
+  ;; empty buffers.
+  ;; HOST = remote host name
+  ;; USER = remote user name
+  ;; DIR = remote directory as a full remote path
+  ;; PATH = directory in full efs-path syntax
+  (goto-char (point-min))
+  (efs-save-match-data
+    (if (re-search-forward efs-dos-distinct-date-and-time-regexp nil t)
+	(let ((tbl (efs-make-hashtable))
+	      dir-p)
+	(beginning-of-line)
+	(while (progn
+		 (setq dir-p (eq (following-char) ?d)) ; we're bolp
+		 (re-search-forward
+		  efs-dos-distinct-date-and-time-regexp nil t))
+	  (efs-put-hash-entry (buffer-substring (point)
+						     (progn (end-of-line)
+							    (point)))
+				   (list dir-p) tbl)
+	  (forward-line 1))
+	(efs-put-hash-entry "." '(t) tbl)
+	(efs-put-hash-entry ".." '(t) tbl)
+	tbl))))
+
+(efs-defun efs-allow-child-lookup dos-distinct (host user dir file)
+  ;; Returns t if FILE in directory DIR could possibly be a subdir
+  ;; according to its file-name syntax, and therefore a child listing should
+  ;; be attempted.
+  ;; Subdirs in DOS can't have an extension.
+  (not (string-match "\\." file)))
+
+;;; Tree Dired
+
+(defconst efs-dired-dos-distinct-re-exe
+  "^[^\n]+\\.exe$")
+
+(or (assq 'dos-distinct efs-dired-re-exe-alist)
+    (setq efs-dired-re-exe-alist
+	  (cons (cons 'dos-distinct  efs-dired-dos-distinct-re-exe)
+		efs-dired-re-exe-alist)))
+
+(defconst efs-dired-dos-distinct-re-dir
+  "^. [ \t]*d")
+
+(or (assq 'dos-distinct efs-dired-re-dir-alist)
+    (setq efs-dired-re-dir-alist
+	  (cons (cons 'dos-distinct  efs-dired-dos-distinct-re-dir)
+		efs-dired-re-dir-alist)))
+
+(efs-defun efs-dired-insert-headerline dos-distinct (dir)
+  ;; The Distinct DOS server 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 dos-distinct
+  (&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 Distinct's DOS FTP server.
+  (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"))
+    (if (re-search-forward efs-dos-distinct-date-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 dos-distinct
+  (&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 version for Distinct's DOS FTP server.
+  (let ((opoint (point)))
+    (and selective-display
+	 (null no-error)
+	 (eq (char-after
+	      (1- (or bol (save-excursion
+			    (skip-chars-backward "^\r\n")
+			    (point)))))
+	     ?\r)
+	 ;; it's 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."
+	     )))))
+    (skip-chars-forward "-_+=a-z0-9.$")
+    (if (or (= opoint (point)) (not (memq (following-char) '(\n \r))))
+	(if no-error
+	    nil
+	  (error "No file on this line"))
+      (point))))
+
+;;; end of efs-dos-distinct.el