22
|
1 ;; -*-Emacs-Lisp-*-
|
|
2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
3 ;;
|
|
4 ;; File: efs-dos-distinct.el
|
|
5 ;; Release: $efs release: 1.15 $
|
42
|
6 ;; Version: #Revision: 1.1 $
|
22
|
7 ;; RCS:
|
|
8 ;; Description: Distinct's DOS FTP server support for efs
|
|
9 ;; Author: Sandy Rutherford <sandy@tsmi19.sissa.it>
|
|
10 ;; Created: Fri Jan 15 22:20:32 1993 by sandy on ibm550
|
|
11 ;; Modified: Sun Nov 27 18:30:04 1994 by sandy on gandalf
|
|
12 ;;
|
|
13 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
14
|
|
15 ;;; This file is part of efs. See efs.el for copyright
|
|
16 ;;; (it's copylefted) and warrranty (there isn't one) information.
|
|
17
|
|
18 ;;; Thanks to Rodd Zurcher <rbz@hook.corp.mot.com> for beta testing.
|
|
19
|
|
20 (provide 'efs-dos-distinct)
|
|
21 (require 'efs)
|
|
22
|
|
23 (defconst efs-dos-distinct-version
|
|
24 (concat (substring "$efs release: 1.15 $" 14 -2)
|
|
25 "/"
|
42
|
26 (substring "#Revision: 1.1 $" 11 -2)))
|
22
|
27
|
|
28 ;;;; -----------------------------------------------------------------
|
|
29 ;;;; Distinct's DOS FTP server support for efs
|
|
30 ;;;; -----------------------------------------------------------------
|
|
31
|
|
32 ;;; This is not included in efs-dos.el with the support for the
|
|
33 ;;; other dos ftp servers, because the Distinct server uses unix syntax
|
|
34 ;;; for path names.
|
|
35
|
|
36 ;; This is defined in efs.el, but we put it here too.
|
|
37
|
|
38 (defconst efs-dos-distinct-date-and-time-regexp
|
|
39 (concat
|
|
40 " \\(Jan\\|Feb\\|Mar\\|Apr\\|May\\|Jun\\|Jul\\|Aug\\|Sep\\|Oct"
|
|
41 "\\|Nov\\|Dec\\) [ 0-3][0-9],[12][90][0-9][0-9] "
|
|
42 "[ 12][0-9]:[0-5][0-9] "))
|
|
43
|
|
44 ;;; entry point
|
|
45
|
|
46 (efs-defun efs-parse-listing dos-distinct
|
|
47 (host user dir path &optional switches)
|
|
48 ;; Parse the current buffer which is assumed to be a listing from
|
|
49 ;; Distinct's DOS FTP server. Both empty dirs, and ls errors return
|
|
50 ;; empty buffers.
|
|
51 ;; HOST = remote host name
|
|
52 ;; USER = remote user name
|
|
53 ;; DIR = remote directory as a full remote path
|
|
54 ;; PATH = directory in full efs-path syntax
|
|
55 (goto-char (point-min))
|
|
56 (efs-save-match-data
|
|
57 (if (re-search-forward efs-dos-distinct-date-and-time-regexp nil t)
|
|
58 (let ((tbl (efs-make-hashtable))
|
|
59 dir-p)
|
|
60 (beginning-of-line)
|
|
61 (while (progn
|
|
62 (setq dir-p (eq (following-char) ?d)) ; we're bolp
|
|
63 (re-search-forward
|
|
64 efs-dos-distinct-date-and-time-regexp nil t))
|
|
65 (efs-put-hash-entry (buffer-substring (point)
|
|
66 (progn (end-of-line)
|
|
67 (point)))
|
|
68 (list dir-p) tbl)
|
|
69 (forward-line 1))
|
|
70 (efs-put-hash-entry "." '(t) tbl)
|
|
71 (efs-put-hash-entry ".." '(t) tbl)
|
|
72 tbl))))
|
|
73
|
|
74 (efs-defun efs-allow-child-lookup dos-distinct (host user dir file)
|
|
75 ;; Returns t if FILE in directory DIR could possibly be a subdir
|
|
76 ;; according to its file-name syntax, and therefore a child listing should
|
|
77 ;; be attempted.
|
|
78 ;; Subdirs in DOS can't have an extension.
|
|
79 (not (string-match "\\." file)))
|
|
80
|
|
81 ;;; Tree Dired
|
|
82
|
|
83 (defconst efs-dired-dos-distinct-re-exe
|
|
84 "^[^\n]+\\.exe$")
|
|
85
|
|
86 (or (assq 'dos-distinct efs-dired-re-exe-alist)
|
|
87 (setq efs-dired-re-exe-alist
|
|
88 (cons (cons 'dos-distinct efs-dired-dos-distinct-re-exe)
|
|
89 efs-dired-re-exe-alist)))
|
|
90
|
|
91 (defconst efs-dired-dos-distinct-re-dir
|
|
92 "^. [ \t]*d")
|
|
93
|
|
94 (or (assq 'dos-distinct efs-dired-re-dir-alist)
|
|
95 (setq efs-dired-re-dir-alist
|
|
96 (cons (cons 'dos-distinct efs-dired-dos-distinct-re-dir)
|
|
97 efs-dired-re-dir-alist)))
|
|
98
|
|
99 (efs-defun efs-dired-insert-headerline dos-distinct (dir)
|
|
100 ;; The Distinct DOS server has no total line, so we insert a
|
|
101 ;; blank line for aesthetics.
|
|
102 (insert "\n")
|
|
103 (forward-char -1)
|
|
104 (efs-real-dired-insert-headerline dir))
|
|
105
|
|
106 (efs-defun efs-dired-manual-move-to-filename dos-distinct
|
|
107 (&optional raise-error bol eol)
|
|
108 ;; In dired, move to the first char of filename on this line.
|
|
109 ;; Returns (point) or nil if raise-error is nil, and there is no
|
|
110 ;; no filename on this line.
|
|
111 ;; This version is for Distinct's DOS FTP server.
|
|
112 (or eol (setq eol (save-excursion (skip-chars-forward "^\r\n") (point))))
|
|
113 (let (case-fold-search)
|
|
114 (if bol
|
|
115 (goto-char bol)
|
|
116 (skip-chars-backward "^\n\r"))
|
|
117 (if (re-search-forward efs-dos-distinct-date-and-time-regexp eol t)
|
|
118 (point)
|
|
119 (and raise-error (error "No file on this line")))))
|
|
120
|
|
121 (efs-defun efs-dired-manual-move-to-end-of-filename dos-distinct
|
|
122 (&optional no-error bol eol)
|
|
123 ;; Assumes point is at the beginning of filename.
|
|
124 ;; So, it should be called only after (dired-move-to-filename t)
|
|
125 ;; On failure signals an error, or returns nil.
|
|
126 ;; This is the version for Distinct's DOS FTP server.
|
|
127 (let ((opoint (point)))
|
|
128 (and selective-display
|
|
129 (null no-error)
|
|
130 (eq (char-after
|
|
131 (1- (or bol (save-excursion
|
|
132 (skip-chars-backward "^\r\n")
|
|
133 (point)))))
|
|
134 ?\r)
|
|
135 ;; it's hidden or omitted
|
|
136 (cond
|
|
137 ((dired-subdir-hidden-p (dired-current-directory))
|
|
138 (error
|
|
139 (substitute-command-keys
|
|
140 "File line is hidden. Type \\[dired-hide-subdir] to unhide.")))
|
|
141 ((error
|
|
142 (substitute-command-keys
|
|
143 "File line is omitted. Type \\[dired-omit-toggle] to un-omit."
|
|
144 )))))
|
|
145 (skip-chars-forward "-_+=a-z0-9.$")
|
|
146 (if (or (= opoint (point)) (not (memq (following-char) '(\n \r))))
|
|
147 (if no-error
|
|
148 nil
|
|
149 (error "No file on this line"))
|
|
150 (point))))
|
|
151
|
|
152 ;;; end of efs-dos-distinct.el
|