Mercurial > hg > xemacs-beta
view lisp/efs/efs-hell.el @ 124:9b50b4588a93 r20-1b15
Import from CVS: tag r20-1b15
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:26:39 +0200 |
parents | 8b8b7f3559a2 |
children |
line wrap: on
line source
;; -*-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