diff lisp/efs/efs-hell.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-hell.el	Mon Aug 13 08:50:29 2007 +0200
@@ -0,0 +1,185 @@
+;; -*-Emacs-Lisp-*-
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; File:         efs-hell.el
+;; Release:      $efs release: 1.15 $
+;; Version:      $Revision: 1.1 $
+;; RCS:          
+;; Description:  Hellsoft FTP server support for efs
+;; Author:       Sandy Rutherford <sandy@ibm550.sissa.it>
+;; Created:      Tue May 25 02:31:37 1993 by sandy on ibm550
+;; Modified:     Sun Nov 27 18:32:27 1994 by sandy on gandalf
+;; Language:     Emacs-Lisp
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;;; This file is part of efs. See efs.el for copyright
+;;; (it's copylefted) and warrranty (there isn't one) information.
+
+(provide 'efs-hell)
+(require 'efs)
+
+(defconst efs-hell-version
+  (concat (substring "$efs release: 1.15 $" 14 -2)
+	  "/"
+	  (substring "$Revision: 1.1 $" 11 -2)))
+
+;;;; --------------------------------------------------------------
+;;;; Hellsoft FTP server support for efs
+;;;; --------------------------------------------------------------
+
+;;; The hellsoft FTP server runs on DOS PC's and Macs. The hellsoft
+;;; support here probably won't work for Macs. If enough people need it
+;;; the Mac support _might_ be fixed.
+
+;;; Works for "novell FTP Server for NW 3.11 (v1.8), (c) by HellSoft."
+
+;; Hellsoft uses unix path syntax. However, we shouldn't append a "."
+;; to directories, because if foobar is a plain file, then
+;; dir foobar/ will not give a listing (which is correct), but
+;; dir foobar/. will give a one-line listing (which is a little strange).
+
+(efs-defun efs-fix-dir-path hell (dir-path)
+  dir-path)
+
+;; Hellsoft returns PWD output in upper case, whereas dir listings are
+;; in lower case. To avoid confusion, downcase pwd output.
+
+(efs-defun efs-send-pwd hell (host user &optional xpwd)
+  ;; Returns ( DIR . LINE ), where DIR is either the current directory, or
+  ;; nil if this couldn't be found. LINE is the line of output from the
+  ;; FTP server. Since the hellsoft server returns pwd output in uppercase, we
+  ;; downcase it.
+  (let ((result (efs-send-pwd 'unix host user xpwd)))
+    (if (car result)
+	(setcar result (downcase (car result))))
+    result))
+
+(defconst efs-hell-date-and-time-regexp
+  (concat
+   " \\([0-9]+\\) \\(Jan\\|Feb\\|Mar\\|Apr\\|May\\|Jun\\|Jul\\|Aug\\|Sep\\|Oct"
+   "\\|Nov\\|Dec\\) [0-3][0-9] "
+   "\\([012][0-9]:[0-5][0-9]\\| [12][019][0-9][0-9]\\) "))
+;; The end of this regexp corresponds to the start of a filename.
+
+(defmacro efs-hell-parse-file-line ()
+  ;; Returns ( FILENAME DIR-P SIZE ) from the current line
+  ;; of a hellsoft listing. Assumes that the point is at the beginning
+  ;; of the line.
+  (` (let ((eol (save-excursion (end-of-line) (point)))
+	   (dir-p (= (following-char) ?d)))
+       (if (re-search-forward efs-hell-date-and-time-regexp eol t)
+	   (list (buffer-substring (point) (progn (end-of-line) (point)))
+		 dir-p
+		 (string-to-int (buffer-substring (match-beginning 1)
+						  (match-end 1))))))))
+       
+(efs-defun efs-parse-listing hell
+  (host user dir path &optional switches)
+  ;; Parse the current buffer which is assumed to be a listing from
+  ;; a Hellsoft FTP server.
+  ;; 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-hell-date-and-time-regexp nil t)
+	(let ((tbl (efs-make-hashtable))
+	      file-info)
+	  (beginning-of-line)
+	  (while (setq file-info (efs-hell-parse-file-line))
+	    (efs-put-hash-entry (car file-info) (cdr file-info) tbl)
+	    (forward-line 1))
+	  (efs-put-hash-entry "." '(t) tbl)
+	  (efs-put-hash-entry ".." '(t) tbl)
+	  tbl)
+      (if (not (string-match (efs-internal-file-name-nondirectory
+			      (efs-internal-directory-file-name dir)) "\\."))
+	  ;; It's an empty dir
+	  (let ((tbl (efs-make-hashtable)))
+	    (efs-put-hash-entry "." '(t) tbl)
+	    (efs-put-hash-entry ".." '(t) tbl)
+	    tbl)))))
+
+
+(efs-defun efs-allow-child-lookup hell (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-hell-re-exe
+  "^[^\n]+\\.exe$")
+
+(or (assq 'hell efs-dired-re-exe-alist)
+    (setq efs-dired-re-exe-alist
+	  (cons (cons 'hell  efs-dired-hell-re-exe)
+		efs-dired-re-exe-alist)))
+
+(defconst efs-dired-hell-re-dir
+  "^. [ \t]*d")
+
+(or (assq 'hell efs-dired-re-dir-alist)
+    (setq efs-dired-re-dir-alist
+	  (cons (cons 'hell  efs-dired-hell-re-dir)
+		efs-dired-re-dir-alist)))
+
+(efs-defun efs-dired-manual-move-to-filename hell
+  (&optional raise-error bol eol)
+  ;; In dired, move to the first char of filename on this line, where
+  ;; line can be delimited by either \r or \n.
+  ;; Returns (point) or nil if raise-error is nil and there is no
+  ;; filename on this line. In the later case, leaves the point at the
+  ;; beginning of the line.
+  ;; This version is for the Hellsoft 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-hell-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 hell
+  (&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 Hellsoft FTP server 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."
+	     )))))
+    (skip-chars-forward "-_+=a-zA-Z0-9.$~")
+    (if (or (= opoint (point)) (not (memq (following-char) '(?\n ?\r))))
+	(if no-error
+	    nil
+	  (error "No file on this line"))
+      (point))))
+
+(efs-defun efs-dired-insert-headerline hell (dir)
+  ;; Insert a blank line for aesthetics
+  (insert "\n")
+  (forward-char -1)
+  (efs-real-dired-insert-headerline dir))
+
+;;; end of efs-hell.el