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

Import from CVS: tag r19-15b94
author cvs
date Mon, 13 Aug 2007 08:50:29 +0200
parents
children 7e54bd776075 9f59509498e1
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/efs/efs-netware.el	Mon Aug 13 08:50:29 2007 +0200
@@ -0,0 +1,196 @@
+;; -*-Emacs-Lisp-*-
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; File:         efs-netware.el
+;; Release:      $efs release: 1.15 $
+;; Version:      $Revision: 1.1 $
+;; RCS:          
+;; Description:  efs support for the Novell Netware FTP server
+;; Author:       Sandy Rutherford <sandy@math.ubc.ca>
+;; Created:      Fri Oct 15 00:30:50 1993 by sandy on gauss.math.ubc.ca
+;; Modified:     Tue Nov 22 00:11:46 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.
+
+;;; Works for (at least) Novell NetWare v3.11. This is a DOS FTP server,
+;;; however, it returns a unix-ish path format.
+
+(provide 'efs-netware)
+(require 'efs)
+
+(defconst efs-netware-version
+  (concat (substring "$efs release: 1.15 $" 14 -2)
+	  "/"
+	  (substring "$Revision: 1.1 $" 11 -2)))
+
+;;; Basic efs support
+
+(defconst efs-netware-date-regexp
+  (concat
+   "\\(Jan\\|Feb\\|Mar\\|Apr\\|May\\|Jun\\|Jul\\|Aug\\|Sep\\|Oct\\|Nov\\|"
+   "Dec\\) [ 0-3][0-9] \\([0-9][0-9] \\)?[0-2][0-9]:[0-6][0-9] +"))
+
+(efs-defun efs-fix-path netware (path &optional reverse)
+  ;; Convert PATH from UNIX-ish to netware.
+  (efs-save-match-data
+    (if reverse
+	(cond ((string-match "^[^/][^:]*:" path)
+	       (concat "/" path))
+	      ((string-match "^/" path)
+	       path)
+	      ((error "%s not a valid netware path." path)))
+      (if (string-match ":" path)
+	  (substring path 1)
+	path))))
+
+(efs-defun efs-fix-dir-path netware (dir-path)
+  ;; Convert DIR-PATH from UN*X-ish to Netware for a DIR listing.
+  (efs-fix-dir-path nil (efs-fix-path 'netware dir-path)))
+
+(defun efs-netware-bogus-listing-p (dir path)
+  (save-excursion
+    (and
+     (not (eobp))
+     (save-excursion (forward-line 1) (eobp))
+     (not (string-equal dir "/"))
+     (re-search-forward efs-netware-date-regexp nil t)
+     (search-forward "/.\n"))))
+
+(efs-defun efs-parse-listing netware (host user dir path &optional switches)
+  ;; Parse the current buffer which is assumed to be a listing from
+  ;; a Novell Netware FTP server (runs under DOS).
+  ;; format, and 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 (not relevant here)
+  (goto-char (point-min))
+  (efs-save-match-data
+    (if (re-search-forward efs-netware-date-regexp nil t)
+	(progn
+	  (beginning-of-line)
+	  (and (not (efs-netware-bogus-listing-p dir path))
+	       (let ((tbl (efs-make-hashtable))
+		     dir-p file size)
+		 (while (let ((eol (save-excursion (end-of-line) (point))))
+			  (setq dir-p (= (following-char) ?d))
+			  (re-search-forward efs-netware-date-regexp eol t))
+		   (setq file (buffer-substring (point)
+						(progn (end-of-line) (point)))
+			 size (progn
+				(goto-char (match-beginning 0))
+				(skip-chars-backward " ")
+				(buffer-substring (point)
+						  (progn
+						    (skip-chars-backward "0-9")
+						    (point)))))
+		   (if (string-equal size "")
+		       (setq size nil)
+		     (setq size (string-to-int size)))
+		   (efs-put-hash-entry file (list dir-p size) tbl)
+		   (forward-line 1))
+		 (efs-put-hash-entry "." '(t) tbl)
+		 (efs-put-hash-entry ".." '(t) tbl)
+		 tbl))))))
+
+;;; Sorting dir listings.
+
+(efs-fset 'efs-t-converter 'netware 'efs-unix-t-converter)
+
+;;; Dired support
+
+(defconst efs-dired-netware-re-exe "\\.\\(exe\\|EXE\\)$")
+(or (assq 'netware efs-dired-re-exe-alist)
+    (setq efs-dired-re-exe-alist
+	  (cons (cons 'netware efs-dired-netware-re-exe)
+		efs-dired-re-exe-alist)))
+
+(defconst efs-dired-netware-re-dir "^.[ \t]+d ")
+(or (assq 'netware efs-dired-re-dir-alist)
+    (setq efs-dired-re-dir-alist
+	  (cons (cons 'netware  efs-dired-netware-re-dir)
+		efs-dired-re-dir-alist)))
+
+(efs-defun efs-dired-manual-move-to-filename netware
+  (&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 is the Netware version.
+  (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"))
+    ;; move over marker
+    (if (re-search-forward efs-netware-date-regexp eol t)
+	(goto-char (match-end 0)) ; returns (point)
+      (and raise-error (error "No file on this line")))))
+
+(efs-defun efs-dired-manual-move-to-end-of-filename netware
+  (&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 Netware 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-Z\n\r")
+    (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 netware (dir)
+  ;; Insert a blank line for aesthetics.
+  (insert " \n")
+  (forward-char -2)
+  (efs-real-dired-insert-headerline dir))
+
+(efs-defun efs-dired-fixup-listing netware
+  (file path &optional switches wildcard)
+  ;; listings come out in random order
+  (let (case-fold-search)
+    (if (or (null switches)
+	    ;; In case efs is handling the switches itself.
+	    (not (string-match "t" switches)))
+	(progn
+	  (goto-char (point-max))
+	  (if (re-search-backward efs-netware-date-regexp nil t)
+	      (save-restriction
+		(forward-line 1)
+		(narrow-to-region (point-min) (point))
+		(forward-line -1)
+		;; Count how many fields
+		(let ((fields 0))
+		  (skip-chars-forward " \t")
+		  (while (not (eolp))
+		    (skip-chars-forward "^  \t\n")
+		    (skip-chars-forward " \t")
+		    (setq fields (1+ fields)))
+		  (sort-fields fields (point-min) (point-max)))))))))
+
+;;; end of efs-netware.el