diff lisp/efs/efs-nos-ve.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-nos-ve.el	Mon Aug 13 08:50:29 2007 +0200
@@ -0,0 +1,209 @@
+;; -*-Emacs-Lisp-*-
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; File:         efs-nos-ve.el
+;; Release:      $efs release: 1.15 $
+;; Version:      $Revision: 1.1 $
+;; RCS:          
+;; Description:  efs support for NOS/VE
+;; Authors:      Sandy Rutherford <sandy@ibm550.sissa,it>
+;; Created:      Fri Aug 19 04:57:09 1994 by sandy on ibm550
+;; Modified:     Sun Nov 27 18:39:43 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.
+
+(provide 'efs-nos-ve)
+(require 'efs)
+
+;;; Works for NOS/VE from CDC.  NOS/VE runs on Cybers.
+
+;;; Thank you to Jost Krieger <Jost.Krieger@rz.ruhr-uni-bochum.de> for
+;;; providing imformation and testing.
+
+(defconst efs-nos-ve-version
+  (concat (substring "$efs release: 1.15 $" 14 -2)
+	  "/"
+	  (substring "$Revision: 1.1 $" 11 -2)))
+
+;;;;---------------------------------------------------------------
+;;;; NOS/VE support for efs
+;;;;---------------------------------------------------------------
+
+;;; A legal NOS/VE filename is of the form
+;;;    <family>.<dirname>.<dirname>.<direname>.....<filename>
+;;;    where <family> always starts with the char : and is followed by
+;;;    alphanumeric characters.  Each <dirname> or <filename> can be up to 31
+;;;    characters.  File names are case insensistive.
+;;; eg. :FOO.DIR_1.DIR_2.BAR
+;;;
+;;; The character set consists of (single case) alphabet, the numerals,
+;;; and the characters "@$_#". (Not the quotes ...) The characters
+;;; "[\]{|}" will also occur in a misguided attempt at
+;;; internationalization. A filename may not start with a numeral.
+
+
+;;; entry points
+
+(efs-defun efs-fix-path nos-ve (path &optional reverse)
+  ;; Convert path from UNIX to NOS/VE.
+  ;; If REVERSE is non-nil, goes in the opposite direction.
+  (if reverse
+      (let* ((res (concat "." path))
+	     (len (length res))
+	     (n 0))
+	(while (< n len)
+	  (and (= (aref res n) ?.) (aset res n ?/))
+	  (setq n (1+ n)))
+	res)
+    (let* ((res (substring (efs-internal-directory-file-name path) 1))
+	   (len (length res))
+	   (n 0))
+      (while (< n len)
+	(and (= (aref res n) ?/) (aset res n ?.))
+	(setq n (1+ n)))
+      res)))
+
+(efs-defun efs-fix-dir-path nos-ve (dir-path)
+  ;; Converts DIR-PATH to NOS/VE format for a directory listing.
+  (efs-fix-path 'nos-ve dir-path))
+
+;;; parser
+
+(defconst efs-nos-ve-file-line-regexp
+  (concat
+   " \\([>0-9,]+\\) bytes \\(in [0-9]+ \\(file\\|catalog\\)s?\\)?\\|"
+   "\\( -- empty catalog\\)\\| -- device"))
+
+(efs-defun efs-parse-listing nos-ve (host user dir path &optional switches)
+  ;; Parse the current buffer which is assumed to be a NOS/VE listing.
+  ;; Returns a hashtable.
+  (goto-char (point-min))
+  (efs-save-match-data
+    (if (and (re-search-forward efs-nos-ve-file-line-regexp
+				(save-excursion (end-of-line) (point)) t)
+	     (or (match-beginning 2) (match-beginning 4)))
+	(let ((tbl (efs-make-hashtable))
+	      size dir-p file)
+	  (forward-line 1)
+	  (while (re-search-forward efs-nos-ve-file-line-regexp
+				    (save-excursion (end-of-line) (point)) t)
+	    (setq size (and (match-beginning 1)
+			    (buffer-substring
+			     (match-beginning 1) (match-end 1)))
+		  dir-p (null (null (or (match-beginning 2)
+					(match-beginning 4)))))
+	    (if size
+		(let ((start 0)
+		      res)
+		  (while (string-match "," size start)
+		    (setq res (concat res (substring size start
+						     (match-beginning 0)))
+			  start (match-end 0)))
+		  (setq size (string-to-int
+			      (concat res (substring size start))))))
+	    (beginning-of-line)
+	    (forward-char 2)
+	    (setq file (buffer-substring
+			(point)
+			(progn (skip-chars-forward "^ \t\n") (point))))
+	    (efs-put-hash-entry file (list dir-p size)
+				(or tbl (setq tbl (efs-make-hashtable))))
+	    (forward-line 1))
+	  (efs-put-hash-entry "." '(t) tbl)
+	  (efs-put-hash-entry ".." '(t) tbl)
+	  tbl))))
+
+(efs-defun efs-allow-child-lookup nos-ve (host user dir file)
+  ;; Returns non-nil if in directory DIR,  FILE could possibly be a subdir
+  ;; according to its file-name syntax, and therefore a child listing should
+  ;; be attempted. Note that DIR is in directory syntax.
+  ;; i.e. /foo/bar/, not /foo/bar.
+  ;; Deal with dired. Anything else?
+  (not (and (boundp 'dired-local-variables-file)
+	    (stringp dired-local-variables-file)
+	    (string-equal (downcase dired-local-variables-file)
+			  (downcase file)))))
+
+;;; Tree Dired
+
+(defconst efs-dired-nos-ve-re-exe "^.[^ \t\n]")
+;; Matches no lines.  Should it match something?
+
+(or (assq 'nos-ve efs-dired-re-exe-alist)
+    (setq efs-dired-re-exe-alist
+	  (cons (cons 'nos-ve  efs-dired-nos-ve-re-exe)
+		efs-dired-re-exe-alist)))
+
+(defconst efs-dired-nos-ve-re-dir " [0-9,]+ bytes in [0-9]+ file")
+
+(or (assq 'nos-ve efs-dired-re-dir-alist)
+    (setq efs-dired-re-dir-alist
+	  (cons (cons 'nos-ve  efs-dired-nos-ve-re-dir)
+		efs-dired-re-dir-alist)))
+
+(efs-defun efs-dired-fixup-listing nos-ve (file path &optional switches
+						wildcard)
+  ;; Need to turn the header line into something to masquerading as a file
+  ;; line, and need to remove the indentation.  Both upset dired.
+  (goto-char (point-min))
+  (while (search-forward "\n  " nil t)
+    (delete-char -2))
+  (goto-char (point-min))
+  (if (looking-at "\\([^ \n]+ +\\)[0-9,]+ bytes in [0-9]+ file")
+      (progn
+	(delete-region (match-beginning 1) (match-end 1))
+	(insert "  Total of "))))
+
+(defconst efs-dired-nos-ve-file-line-regexp
+  (concat
+   ".[ \t]+\\([][{}|\\\\a-z0-9@$_#]+\\) +"
+   "\\([>0-9,]+ bytes\\|-- \\(empty\\|device\\)\\)"))
+
+(efs-defun efs-dired-manual-move-to-filename nos-ve
+  (&optional raise-error bol eol)
+  ;; In dired, move to first char of filename on this line.
+  ;; Returns position (point) or nil if no filename on this line.
+  ;; This is the NOS/VE version.
+  (if bol
+      (goto-char bol)
+    (skip-chars-backward "^\n\r"))
+  (if (looking-at efs-dired-nos-ve-file-line-regexp)
+      (goto-char (match-beginning 1))
+    (and raise-error (error "No file on this line"))))
+
+(efs-defun efs-dired-manual-move-to-end-of-filename nos-ve
+  (&optional no-error bol eol)
+  ;; Assumes point is at beginning of filename.
+  ;; So, it should be called only after (dired-move-to-filename t).
+  ;; case-fold-search must be nil, at least for VMS.
+  ;; On failure, signals an error or returns nil.
+  ;; This is the NOS/VE 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-z0-9$@#\\\\[]{}|") ; right char set?
+    (if (or (= opoint (point)) (/= (following-char) ?\ ))
+	(if no-error
+	    nil
+	  (error "No file on this line"))
+      (point))))
+
+;;; end of efs-nos-ve.el