;ELC ;;; compiled by rms@mole.gnu.ai.mit.edu on Sun Jul 31 15:26:20 1994 ;;; from file /home/fsf/rms/e19/lisp/ange-ftp.el ;;; emacs version 19.25.90.2. ;;; bytecomp version FSF 2.10 ;;; optimization is on. ;;; this file uses opcodes which do not exist in Emacs 18. (if (and (boundp 'emacs-version) (or (and (boundp 'epoch::version) epoch::version) (string-lessp emacs-version "19"))) (error "`/home/fsf/rms/e19/lisp/ange-ftp.el' was compiled for Emacs 19")) (require (quote comint)) (defvar ange-ftp-name-format (quote ("^/\\(\\([^@/:]*\\)@\\)?\\([^@/:]*\\):\\(.*\\)" 3 2 4)) "\ *Format of a fully expanded remote file name. This is a list of the form (REGEXP HOST USER NAME), where REGEXP is a regular expression matching the full remote name, and HOST, USER, and NAME are the numbers of parenthesized expressions in REGEXP for the components (in that order).") (defvar ange-ftp-multi-msgs "^220-\\|^230-\\|^226\\|^25.-\\|^221-\\|^200-\\|^331-\\|^4[25]1-\\|^530-" "\ *Regular expression matching the start of a multiline ftp reply.") (defvar ange-ftp-good-msgs "^220 \\|^230 \\|^226 \\|^25. \\|^221 \\|^200 \\|^[Hh]ash mark" "\ *Regular expression matching ftp \"success\" messages.") (defvar ange-ftp-skip-msgs (concat "^200 \\(PORT\\|Port\\) \\|^331 \\|^150 \\|^350 \\|^[0-9]+ bytes \\|" "^Connected \\|^$\\|^Remote system\\|^Using\\|^ \\|Password:\\|" "^local:\\|^Trying\\|^125 \\|^550-\\|^221 .*oodbye") "\ *Regular expression matching ftp messages that can be ignored.") (defvar ange-ftp-fatal-msgs (concat "^ftp: \\|^Not connected\\|^530 \\|^4[25]1 \\|rcmd: \\|" "^No control connection\\|unknown host\\|^lost connection") "\ *Regular expression matching ftp messages that indicate serious errors. These mean that the FTP process should (or already has) been killed.") (defvar ange-ftp-gateway-fatal-msgs "No route to host\\|Connection closed\\|No such host\\|Login incorrect" "\ *Regular expression matching login failure messages from rlogin/telnet.") (defvar ange-ftp-xfer-size-msgs "^150 .* connection for .* (\\([0-9]+\\) bytes)" "\ *Regular expression used to determine the number of bytes in a FTP transfer.") (defvar ange-ftp-tmp-name-template "/tmp/ange-ftp" "\ *Template used to create temporary files.") (defvar ange-ftp-gateway-tmp-name-template "/tmp/ange-ftp" "\ *Template used to create temporary files when ftp-ing through a gateway. Files starting with this prefix need to be accessible from BOTH the local machine and the gateway machine, and need to have the SAME name on both machines, that is, /tmp is probably NOT what you want, since that is rarely cross-mounted.") (defvar ange-ftp-netrc-filename "~/.netrc" "\ *File in .netrc format to search for passwords.") (defvar ange-ftp-disable-netrc-security-check nil "\ *If non-nil avoid checking permissions on the .netrc file.") (defvar ange-ftp-default-user nil "\ *User name to use when none is specied in a file name. If nil, then the name under which the user is logged in is used. If non-nil but not a string, the user is prompted for the name.") (defvar ange-ftp-default-password nil "\ *Password to use when the user is the same as ange-ftp-default-user.") (defvar ange-ftp-default-account nil "\ *Account password to use when the user is the same as ange-ftp-default-user.") (defvar ange-ftp-generate-anonymous-password t "\ *If t, use a password of user@host when logging in as the anonymous user. If a string then use that as the password. If nil then prompt the user for a password.") (defvar ange-ftp-dumb-unix-host-regexp nil "\ *If non-nil, regexp matching hosts on which `dir' command lists directory.") (defvar ange-ftp-binary-file-name-regexp (concat "\\.[zZ]$\\|\\.lzh$\\|\\.arc$\\|\\.zip$\\|\\.zoo$\\|\\.tar$\\|" "\\.dvi$\\|\\.ps$\\|\\.elc$\\|TAGS$\\|\\.gif$\\|" "\\.EXE\\(;[0-9]+\\)?$\\|\\.[zZ]-part-..$\\|\\.gz$\\|" "\\.taz$\\|\\.tgz$") "\ *If a file matches this regexp then it is transferred in binary mode.") (defvar ange-ftp-gateway-host nil "\ *Name of host to use as gateway machine when local FTP isn't possible.") (defvar ange-ftp-local-host-regexp ".*" "\ *Regexp selecting hosts which can be reached directly with ftp. For other hosts the FTP process is started on `ange-ftp-gateway-host' instead.") (defvar ange-ftp-gateway-program-interactive nil "\ *If non-nil then the gateway program should give a shell prompt. Both telnet and rlogin do something like this.") (defvar ange-ftp-gateway-program (byte-code "=‡Ç" [system-type hpux "remsh" "rsh"] 2) "\ *Name of program to spawn a shell on the gateway machine. Valid candidates are rsh (remsh on hp-ux), telnet and rlogin. See also the gateway variable above.") (defvar ange-ftp-gateway-prompt-pattern "^[^#$%>;\n]*[#$%>;] *" "\ *Regexp matching prompt after complete login sequence on gateway machine. A match for this means the shell is now awaiting input. Make this regexp as strict as possible; it shouldn't match *anything* at all except the user's initial prompt. The above string will fail under most SUN-3's since it matches the login banner.") (defvar ange-ftp-gateway-setup-term-command (byte-code "=‡Ç" [system-type hpux "stty -onlcr -echo\n" "stty -echo nl\n"] 2) "\ *Set up terminal after logging in to the gateway machine. This command should stop the terminal from echoing each command, and arrange to strip out trailing ^M characters.") (defvar ange-ftp-smart-gateway nil "\ *Non-nil means the ftp gateway is smart. Don't bother telnetting, etc., just issue a user@host command instead.") (defvar ange-ftp-smart-gateway-port "21" "\ *Port on gateway machine to use when smart gateway is in operation.") (defvar ange-ftp-send-hash t "\ *If non-nil, send the HASH command to the FTP client.") (defvar ange-ftp-binary-hash-mark-size nil "\ *Default size, in bytes, between hash-marks when transferring a binary file. If NIL, this variable will be locally overridden if the FTP client outputs a suitable response to the HASH command. If non-NIL then this value takes precedence over the local value.") (defvar ange-ftp-ascii-hash-mark-size 1024 "\ *Default size, in bytes, between hash-marks when transferring an ASCII file. This variable is buffer-local and will be locally overridden if the FTP client outputs a suitable response to the HASH command.") (defvar ange-ftp-process-verbose t "\ *If non-NIL then be chatty about interaction with the FTP process.") (defvar ange-ftp-ftp-program-name "ftp" "\ *Name of FTP program to run.") (defvar ange-ftp-gateway-ftp-program-name "ftp" "\ *Name of FTP program to run on gateway machine. Some AT&T folks claim to use something called `pftp' here.") (defvar ange-ftp-ftp-program-args (quote ("-i" "-n" "-g" "-v")) "\ *A list of arguments passed to the FTP program when started.") (defvar ange-ftp-nslookup-program nil "\ *If non-NIL then a string naming nslookup program.") (defvar ange-ftp-make-backup-files nil "\ *Non-nil means make backup files for \"magic\" remote files.") (defvar ange-ftp-retry-time 5 "\ *Number of seconds to wait before retry if file or listing doesn't arrive. This might need to be increased for very slow connections.") (defvar ange-ftp-auto-save 0 "\ If 1, allows ange-ftp files to be auto-saved. If 0, suppresses auto-saving of ange-ftp files. Don't use any other value.") (require (quote backquote)) (defalias 'ange-ftp-make-hashtable #[(&optional size) " \"" [make-vector size 31 0] 3 "\ Make an obarray suitable for use as a hashtable. SIZE, if supplied, should be a prime number."]) (defalias 'ange-ftp-map-hashtable #[(fun tbl) "\n\"" [mapatoms #[(sym) " N N\"" [fun sym key val] 4] tbl] 3 "\ Call FUNCTION on each key and value in HASHTABLE."]) (defalias 'ange-ftp-make-hash-key '(macro . #[(key) "\nD\n\nDF" [if stringp key prin1-to-string] 5 "\ Convert KEY into a suitable key for a hashtable."])) (defalias 'ange-ftp-get-hash-entry #[(key tbl) " ;\n ! \"\fN)" [intern-soft key prin1-to-string tbl sym val] 4 "\ Return the value associated with KEY in HASHTABLE."]) (defalias 'ange-ftp-put-hash-entry #[(key val tbl) " ;\n ! \"\f#\f #)" [intern key prin1-to-string tbl sym put val] 4 "\ Record an association between KEY and VALUE in HASHTABLE."]) (defalias 'ange-ftp-del-hash-entry #[(key tbl) "G ! S\"\fY#\f \fHI\fS+" [tbl len ange-ftp-make-hashtable new-tbl i ange-ftp-map-hashtable #[(k v) "  \f#" [k key ange-ftp-put-hash-entry v new-tbl] 4] 0] 5 "\ Copy all symbols except KEY in HASHTABLE and return modified hashtable."]) (defalias 'ange-ftp-hash-entry-exists-p #[(key tbl) " ;\n ! \"" [intern-soft key prin1-to-string tbl] 3 "\ Return whether there is an association for KEY in TABLE."]) (defalias 'ange-ftp-hash-table-keys #[(tbl) " \"\"" [sort all-completions "" tbl string-lessp] 4 "\ Return a sorted list of all the active keys in TABLE, as strings."]) (byte-code "‡" ["$Revision: 1.56 $" ange-ftp-version nil] 1) (defvar ange-ftp-data-buffer-name " *ftp data*" "\ Buffer name to hold directory listing data received from ftp process.") (defvar ange-ftp-netrc-modtime nil "\ Last modified time of the netrc file from file-attributes.") (defvar ange-ftp-user-hashtable (ange-ftp-make-hashtable) "\ Hash table holding associations between HOST, USER pairs.") (defvar ange-ftp-passwd-hashtable (ange-ftp-make-hashtable) "\ Mapping between a HOST, USER pair and a PASSWORD for them.") (defvar ange-ftp-account-hashtable (ange-ftp-make-hashtable) "\ Mapping between a HOST, USER pair and a ACCOUNT password for them.") (defvar ange-ftp-files-hashtable (ange-ftp-make-hashtable 97) "\ Hash table for storing directories and their respective files.") (defvar ange-ftp-ls-cache-lsargs nil "\ Last set of args used by ange-ftp-ls.") (defvar ange-ftp-ls-cache-file nil "\ Last file passed to ange-ftp-ls.") (defvar ange-ftp-ls-cache-res nil "\ Last result returned from ange-ftp-ls.") (byte-code " ! !!!( !1\n!: !C\f!L !U!^!g#" [ange-ftp-make-hashtable ange-ftp-expand-dir-hashtable "^5.0 \\([^: ]+\\):" ange-ftp-expand-dir-regexp boundp ange-ftp-hash-mark-unit nil ange-ftp-hash-mark-count ange-ftp-xfer-size ange-ftp-process-string ange-ftp-process-result-line ange-ftp-process-busy ange-ftp-process-result ange-ftp-process-multi-skip ange-ftp-process-msg ange-ftp-process-continue ange-ftp-last-percent put ftp-error error-conditions (ftp-error file-error error)] 4) (defalias 'ange-ftp-save-match-data '(macro . #[(&rest body) "!\fDC B\fDEE*" [make-symbol "match-data" nil case-fold-search original let (match-data) unwind-protect progn body store-match-data] 6 "\ Execute the BODY forms, restoring the global value of the match data. Also makes matching case-sensitive within BODY."])) (byte-code "##" [put ange-ftp-save-match-data lisp-indent-hook 0 edebug-form-hook (&rest form)] 4) (defalias 'ange-ftp-message #[(fmt &rest args) "\n # !GY!ZOP\"*" [apply format fmt args window-width minibuffer-window max msg "> " 3 nil message "%s"] 5 "\ Display message in echo area, but indicate if truncated. Args are as in `message': a format string, plus arguments to be formatted."]) (defalias 'ange-ftp-abbreviate-filename #[(file &optional new) " Ž  !Q\"ɕSO 6! !6!<*" [match-data match-data ((store-match-data match-data)) default-directory string-match "^" regexp-quote "." file 0 nil new file-name-nondirectory file-name-directory "./"] 4 "\ Abbreviate the file name FILE relative to the default-directory. If the optional parameter NEW is given and the non-directory parts match, only return the directory part of FILE."]) (defalias 'ange-ftp-set-user #[(host user) " \n #" [ange-ftp-put-hash-entry host user ange-ftp-user-hashtable] 4 "\ For a given HOST, set or change the default USER." "sHost: \nsUser: "]) (defalias 'ange-ftp-get-user #[(host) " \n \"1 ; * (\n\" \")* \n\f\")" [ange-ftp-parse-netrc ange-ftp-get-hash-entry host ange-ftp-user-hashtable user ange-ftp-default-user t enable-recursive-minibuffers read-string format "User for %s: " user-login-name ange-ftp-set-user] 5 "\ Given a HOST, return the default USER."]) (defalias 'ange-ftp-read-passwd #[(prompt &optional default) " ‰\nG\"# UoUoUoUCU]U]!PGVO! ," [default "" 0 t cursor-in-echo-area echo-keystrokes c pass message "%s%s" prompt make-string 46 read-char 13 10 27 21 8 127 char-to-string -1 ange-ftp-repaint-minibuffer] 7 "\ Read a password, echoing `.' for each character typed. End with RET, LFD, or ESC. DEL or C-h rubs out. C-u kills line. Optional DEFAULT is password to start with."]) (byte-code "\"\"" [defalias ange-ftp-generate-passwd-key (macro . #[(host user) " F" [concat host "/" user] 4]) ange-ftp-lookup-passwd (macro . #[(host user) "\n EBB" [ange-ftp-get-hash-entry ange-ftp-generate-passwd-key host user (ange-ftp-passwd-hashtable)] 4])] 3) (defalias 'ange-ftp-set-passwd #[(host user passwd) " Q\f #" [ange-ftp-put-hash-entry host "/" user passwd ange-ftp-passwd-hashtable] 4 "\ For a given HOST and USER, set or change the associated PASSWORD." (list (read-string "Host: ") (read-string "User: ") (ange-ftp-read-passwd "Password: "))]) (defalias 'ange-ftp-get-host-with-passwd #[(user) " " [ange-ftp-parse-netrc found-one (byte-code "\n\" Ŏ\"*ȇ" [ange-ftp-map-hashtable #[(host val) " Q\f\" \"" [ange-ftp-get-hash-entry host "/" user ange-ftp-passwd-hashtable throw found-one] 4] ange-ftp-user-hashtable match-data match-data ((store-match-data match-data)) #[(key value) "\n\"\"\nĔO\nĕO!! \")" [string-match "^[^/]*\\(/\\).*$" key 0 1 host user nil value throw found-one] 4] ange-ftp-passwd-hashtable nil] 3)] 2 "\ Given a USER, return a host we know the password for."]) (defalias 'ange-ftp-get-passwd #[(host user) " \n\fQ \"t;\"\"\f\"\fȘ.\fɘC\nC\n;<\n Q\f!a\f\n\f%\fQ \"\"h\f\n#!\n\f#*" [ange-ftp-parse-netrc ange-ftp-get-hash-entry host "/" user ange-ftp-passwd-hashtable ange-ftp-default-user ange-ftp-default-password "anonymous" "ftp" ange-ftp-generate-anonymous-password user-login-name "@" system-name ange-ftp-get-host-with-passwd other ange-ftp-read-passwd format "passwd for %s@%s (same as %s@%s): " "Password for %s@%s: " passwd ange-ftp-set-passwd] 8 "\ Return the password for specified HOST and USER, asking user if necessary."]) (defalias 'ange-ftp-set-account #[(host user account) " Q\f #" [ange-ftp-put-hash-entry host "/" user account ange-ftp-account-hashtable] 4 "\ For a given HOST and USER, set or change the associated ACCOUNT password." (list (read-string "Host: ") (read-string "User: ") (ange-ftp-read-passwd "Account password: "))]) (defalias 'ange-ftp-get-account #[(host user) " \n\fQ \";\f" [ange-ftp-parse-netrc ange-ftp-get-hash-entry host "/" user ange-ftp-account-hashtable ange-ftp-default-user ange-ftp-default-account] 4 "\ Given a HOST and USER, return the FTP account."]) (defalias 'ange-ftp-chase-symlinks #[(file) " ! !  ! P) " [nil temp ange-ftp-real-file-symlink-p file file-name-absolute-p file-name-directory] 2 "\ Return the filename that FILE references, following all symbolic links."]) (byte-code "\"\"\"\"" [defalias ange-ftp-parse-netrc-token #[(token limit) " \n#1\nwg='u`\nwu `S{0`\nw `{)" [search-forward token limit t nil beg ", \n" 34 1 "^\"" "^, \n"] 4] ange-ftp-parse-netrc-group #[nil "`!wwww#(Ȕ)d)É \n \f  \"\f \"  \"\n \" \f \f \"\f \n# \f  #b # \"  \"\n \"   \n\n   b." [looking-at "machine\\>" "^ \n" nil " \n" re-search-forward "machine\\>\\|default\\>" t 0 account password login machine end start ange-ftp-parse-netrc-token "machine" "login" "password" "account" ange-ftp-set-user ange-ftp-set-passwd ange-ftp-set-account search-forward "default" ange-ftp-default-user ange-ftp-default-password ange-ftp-default-account] 6] ange-ftp-parse-netrc #[nil "\n!! !} 8?}  ʎ 5 8 =m 8\"m!q !  !!\"ebwme [p!)v\n\"! 8**" [ange-ftp-chase-symlinks ange-ftp-real-expand-file-name ange-ftp-netrc-filename file ange-ftp-real-file-attributes attr 5 ange-ftp-netrc-modtime match-data match-data ((store-match-data match-data)) ange-ftp-disable-netrc-security-check 2 user-uid string-match ".r..------" 8 generate-new-buffer "*ftp-.netrc*" ange-ftp-real-insert-file-contents buffer-file-name file-name-directory default-directory normal-mode t mapcar funcall find-file-hooks nil " \n" ange-ftp-parse-netrc-group kill-buffer ange-ftp-message "%s either not owned by you or badly protected." sit-for 1] 5 nil nil] ange-ftp-generate-root-prefixes #[nil " Î\"\n\" C+" [ange-ftp-parse-netrc match-data match-data ((store-match-data match-data)) nil res ange-ftp-map-hashtable #[(key value) "\n\"$\nĔO\nĕORC\nB\n*" [string-match "^[^/]*\\(/\\).*$" key 0 1 nil user host "@" ":" res] 4] ange-ftp-passwd-hashtable #[(host user) "PC\nB" [host ":" res] 2] ange-ftp-user-hashtable] 3]] 3) (defalias 'ange-ftp-ftp-name-component '(macro . #[(n ns name) " \fEDCBBEE" [let elt nth n ns if (match-beginning elt) substring name ((match-beginning elt) (match-end elt))] 7 "\ Extract the Nth ftp file name component from NS."])) (byte-code "!!\"\"" [boundp ange-ftp-ftp-name-arg "" ange-ftp-ftp-name-res nil defalias ange-ftp-ftp-name #[(name) " \n Ŏ@\"qA@ .  O)\nA@ D  O) 8 Z  O) GUj\n! \n E,*" [name ange-ftp-ftp-name-arg ange-ftp-ftp-name-res match-data match-data ((store-match-data match-data)) string-match ange-ftp-name-format ns elt host user 2 0 ange-ftp-get-user] 4] ange-ftp-replace-name-component #[(fullname name) " Ž\f@ \"'\fA8 O\n OQ**" [match-data match-data ((store-match-data match-data)) string-match ange-ftp-name-format fullname ns 2 elt 0 name nil] 5]] 3) (defalias 'ange-ftp-repaint-minibuffer #[nil "!" [message nil] 2 "\ Clear any existing minibuffer message; let the minibuffer contents show."]) (byte-code "\"\"" [defalias ange-ftp-ftp-process-buffer #[(host user) " İ" ["*ftp " user "@" host "*"] 5] ange-ftp-error #[(host user msg) " \"!!db !*\"C\"" [selected-window t pop-up-windows cur pop-to-buffer get-buffer-create ange-ftp-ftp-process-buffer host user select-window signal ftp-error format "FTP Error: %s" msg] 5]] 3) (defalias 'ange-ftp-set-buffer-mode #[nil ";!!\f!" [buffer-file-name ange-ftp-ftp-name make-local-variable make-backup-files ange-ftp-make-backup-files auto-save-mode ange-ftp-auto-save] 2 "\ Set correct modes for the current buffer if visiting a remote file."]) (defalias 'ange-ftp-kill-ftp-process #[(buffer) "p \f\n1 !!0@A@\"!*))" [buffer buffer-file-name default-directory file ange-ftp-ftp-name expand-file-name parsed user host kill-buffer ange-ftp-ftp-process-buffer] 5 "\ Kill the FTP process associated with BUFFER. If the BUFFER's visited filename or default-directory is an ftp filename then kill the related ftp process." "bKill FTP process associated with buffer: "]) (defalias 'ange-ftp-quote-string #[(string) "\f\"\"" [apply concat mapcar #[(char) "XVUU\"!" [char 32 126 34 92 vector] 3] string] 5 "\ Quote any characters in STRING that may confuse the ftp process."]) (defalias (quote ange-ftp-barf-if-not-directory) #[(directory) " ! !Ƃ E\"" [file-directory-p directory signal file-error "Opening directory" file-exists-p "not a directory" "no such file or directory"] 5]) (defalias 'ange-ftp-process-handle-line #[(line proc) " \n\"\nŔŕO!\"\n\" ɇ\n\n\"3\f \n\n\"H!\f\n\n\"Uɉ\\ɇ\f\n" [string-match ange-ftp-xfer-size-msgs line ash string-to-int 1 -10 ange-ftp-xfer-size ange-ftp-skip-msgs t ange-ftp-good-msgs nil ange-ftp-process-busy ange-ftp-process-result ange-ftp-process-result-line ange-ftp-fatal-msgs delete-process proc ange-ftp-multi-msgs ange-ftp-process-multi-skip] 5 "\ Look at the given LINE from the ftp process PROC. Try to categorize it into one of four categories: good, skip, fatal, or unknown."]) (defalias 'ange-ftp-set-xfer-size #[(host user bytes) " \n\" ! q\" )))" [ange-ftp-get-process host user proc process-buffer buf ash bytes -10 ange-ftp-xfer-size] 4 "\ Set the size of the next FTP transfer in bytes."]) (defalias 'ange-ftp-process-handle-hash #[(str) "OOPZ \\\ff f =f!f\nf\f _\"UI\f#e_=d\f#))" [str 0 nil ange-ftp-hash-mark-count ange-ftp-process-msg ange-ftp-process-verbose selected-window minibuffer-window boundp search-message cursor-in-echo-area ash ange-ftp-hash-mark-unit -6 kbytes ange-ftp-xfer-size ange-ftp-message "%s...%dk" 100 percent ange-ftp-last-percent "%s...%d%%"] 5 "\ Remove hash marks from STRING and display count so far."]) (byte-code "\"\"" [defalias ange-ftp-call-cont #[(cont result line) "<@=@ \fA$ \f\"" [cont lambda apply result line] 5] ange-ftp-process-filter #[(proc str) " !p !Ŏ Ȏ !q 1\n1 \"1 !  \"\nP P\"P \"\n\"ԉOԕO\"ԕOm \")P\n?\"   ! !##)+*" [process-buffer proc old-buffer buffer buffer-name ((set-buffer old-buffer)) match-data match-data ((store-match-data match-data)) ange-ftp-hash-mark-unit ange-ftp-process-busy string-match "^#+$" str ange-ftp-process-handle-hash comint-output-filter ange-ftp-process-string "Password: *$" send-string "\n" 0 line nil "^ftp> *" ange-ftp-process-handle-line ange-ftp-xfer-size ange-ftp-process-msg ange-ftp-process-verbose ange-ftp-process-result ange-ftp-message "%s...done" ange-ftp-repaint-minibuffer ange-ftp-process-continue cont ange-ftp-call-cont ange-ftp-process-result-line] 4]] 3) (defalias 'ange-ftp-process-sentinel #[(proc str) " Ž\f! \"( ȔȕO ɔɕO\n \n \"*)͉*" [match-data match-data ((store-match-data match-data)) process-name proc name string-match "\\*ftp \\([^@]+\\)@\\([^*]+\\)*" 1 2 host user ange-ftp-wipe-file-entries nil ange-ftp-ls-cache-file] 4 "\ When ftp process changes state, nuke all file-entries in cache."]) (defalias 'ange-ftp-use-gateway-p #[(host) "? Î \"*?" [ange-ftp-smart-gateway match-data match-data ((store-match-data match-data)) string-match ange-ftp-local-host-regexp host] 3 "\ Returns whether to access this host via a normal (non-smart) gateway."]) (defalias 'ange-ftp-use-smart-gateway-p #[(host) " Î \"*?" [ange-ftp-smart-gateway match-data match-data ((store-match-data match-data)) string-match ange-ftp-local-host-regexp host] 3 "\ Returns whether to access this host via a smart gateway."]) (byte-code "!!!!‡" [boundp ange-ftp-tmp-name-files nil ange-ftp-tmp-name-hashtable ange-ftp-make-hashtable 10 ange-ftp-pid] 2) (defalias 'ange-ftp-get-pid #[nil "!O" [make-temp-name "" 1 nil ange-ftp-pid] 3 "\ Half-hearted attempt to get the current process's id."]) (defalias 'ange-ftp-make-tmp-name #[(host) " !\n\n     \f\f $  \"\f>= !R T V\fP \fB -" [ange-ftp-use-gateway-p host ange-ftp-gateway-tmp-name-template ange-ftp-tmp-name-template template ange-ftp-pid ange-ftp-get-pid pid 97 start nil file entry format "%s%c%s" intern ange-ftp-tmp-name-hashtable ange-ftp-tmp-name-files ange-ftp-real-file-exists-p 122 "X"] 6 "\ This routine will return the name of a new file."]) (byte-code "\"! !\"\"" [defalias ange-ftp-del-tmp-name #[(temp) "\n \"\f\"Ǐ" [delq intern temp ange-ftp-tmp-name-hashtable ange-ftp-tmp-name-files nil (ange-ftp-real-delete-file temp) ((error))] 4] boundp ange-ftp-gwp-running t ange-ftp-gwp-status nil ange-ftp-gwp-sentinel #[(proc str) "" [nil ange-ftp-gwp-running] 2] ange-ftp-gwp-filter #[(proc str) " Ž\f \" \"!\f\n\f!)P\"Z \"8\f\f\f!\"P\"Z \"K\f!҉Z \"Zɉ*" [match-data match-data ((store-match-data match-data)) comint-output-filter proc str string-match "login: *$" send-string t ange-ftp-default-user ange-ftp-get-user ange-ftp-gateway-host "\n" "Password: *$" ange-ftp-get-passwd ange-ftp-gateway-fatal-msgs delete-process nil ange-ftp-gwp-running ange-ftp-gateway-prompt-pattern ange-ftp-gwp-status] 6]] 3) (defalias 'ange-ftp-gwp-start #[(host user name args) " ! $) # !\"\"!q !`֓) \"U!Hb# \"\"\"!t# Q\"+" [ange-ftp-get-user ange-ftp-gateway-host gw-user t process-connection-type start-process name ange-ftp-gateway-program proc mapconcat identity args " " ftp process-kill-without-query set-process-sentinel ange-ftp-gwp-sentinel set-process-filter ange-ftp-gwp-filter process-buffer internal-ange-ftp-mode process-mark nil ange-ftp-gwp-running ange-ftp-gwp-status ange-ftp-message "Connecting to gateway %s..." accept-process-output ange-ftp-error host user "unable to login to gateway" "Connecting to gateway %s...done" process-send-string ange-ftp-gateway-setup-term-command "unable to set terminal modes on gateway" "exec " "\n"] 5 "\ Login to the gateway machine and fire up an ftp process."]) (defalias 'ange-ftp-raw-send-cmd #[(proc cmd &optional msg cont nowait) " !> !q\fʼn *\n  PQQ\"db`œ ߎ\"uӉOyc*#`œ \" !`œ&?\fʼn !*?  B)" [process-status proc (run open) process-buffer ange-ftp-process-busy nil inhibit-quit quit-flag accept-process-output "" ange-ftp-process-string ange-ftp-process-result-line t ange-ftp-process-result ange-ftp-process-multi-skip msg ange-ftp-process-msg cont ange-ftp-process-continue 0 ange-ftp-hash-mark-count -1 ange-ftp-last-percent cmd "\n" ange-ftp-process-verbose ange-ftp-message "%s..." comint-last-input-start match-data match-data ((store-match-data match-data)) string-match "^user \"[^\"]*\"" " Turtle Power!\n" comint-last-input-end send-string process-mark nowait] 3 "\ Low-level routine to send the given ftp CMD to the ftp PROCESS. MSG is an optional message to output before and after the command. If CONT is non-NIL then it is either a function or a list of function and some arguments. The function will be called when the ftp command has completed. If CONT is NIL then this routine will return ( RESULT . LINE ) where RESULT is whether the command was successful, and LINE is the line from the FTP process that caused the command to complete. If NOWAIT is given then the routine will return immediately the command has been queued with no result. CONT will still be called, however."]) (defalias 'ange-ftp-nslookup-host #[(host) "X\n!\n lj$) \n\n!\n!q\n!>=\n!,eb#OӔӕ{ p!) +" [ange-ftp-nslookup-program file-accessible-directory-p default-directory exec-directory t process-connection-type start-process " *nslookup*" host res proc process-kill-without-query process-buffer process-status (run open) accept-process-output re-search-forward "Name:.*\nAddress: *\\(.*\\)$" nil 1 kill-buffer] 6 "\ Attempt to resolve the given HOSTNAME using nslookup if possible." "sHost: "]) (defalias 'ange-ftp-start-process #[(host user name) " !\f \f C\"\n\f!%\f' \f\nZF $dD\"$d$)!!q )\"\"!." [ange-ftp-use-gateway-p host use-gateway ange-ftp-gateway-ftp-program-name ange-ftp-ftp-program-name ftp-prog append ange-ftp-ftp-program-args args nil file-name-handler-alist file-accessible-directory-p default-directory exec-directory proc t process-connection-type ange-ftp-gateway-program-interactive ange-ftp-gwp-start user name apply start-process ange-ftp-gateway-program ange-ftp-gateway-host process-kill-without-query process-buffer internal-ange-ftp-mode set-process-sentinel ange-ftp-process-sentinel set-process-filter ange-ftp-process-filter accept-process-output] 8 "\ Spawn a new ftp process ready to connect to machine HOST and give it NAME. If HOST is only ftp-able through a gateway machine then spawn a shell on the gateway machine to do the ftp instead."]) (defalias 'internal-ange-ftp-mode #[nil " p!db!`ȓ!\n!!!!!!!!!!!!!)" [comint-mode internal-ange-ftp-mode major-mode "Internal Ange-ftp" mode-name get-buffer-process proc process-mark nil make-local-variable ange-ftp-process-string "" ange-ftp-process-busy ange-ftp-process-result ange-ftp-process-msg ange-ftp-process-multi-skip ange-ftp-process-result-line ange-ftp-process-continue ange-ftp-hash-mark-count ange-ftp-binary-hash-mark-size ange-ftp-ascii-hash-mark-size ange-ftp-hash-mark-unit ange-ftp-xfer-size ange-ftp-last-percent 0 "^ftp> " comint-prompt-regexp paragraph-start] 3 "\ Major mode for interacting with the FTP process. \\{comint-mode-map}" nil]) (defalias 'ange-ftp-smart-login #[(host user pass account proc) " !# ## @$  AP#  !% ## @] # #  AP#)" [ange-ftp-raw-send-cmd proc format "open %s %s" ange-ftp-nslookup-host ange-ftp-gateway-host ange-ftp-smart-gateway-port "Opening FTP connection to %s via %s" host result ange-ftp-error user "OPEN request failed: " "user \"%s\"@%s %s %s" pass account "Logging in as user %s@%s" ange-ftp-set-passwd nil ange-ftp-set-account "USER request failed: "] 9 "\ Connect to the FTP-server on HOST as USER using PASSWORD and ACCOUNT. PROC is the FTP-client's process. This routine uses the smart-gateway host specified in ``ange-ftp-gateway-host''."]) (defalias 'ange-ftp-normal-login #[(host user pass account proc) " !\" \"#@  AP#  \f $ ##@P  #  #  AP#)" [ange-ftp-raw-send-cmd proc format "open %s" ange-ftp-nslookup-host host "Opening FTP connection to %s" result ange-ftp-error user "OPEN request failed: " "user \"%s\" %s %s" pass account "Logging in as user %s@%s" ange-ftp-set-passwd nil ange-ftp-set-account "USER request failed: "] 8 "\ Connect to the FTP-server on HOST as USER using PASSWORD and ACCOUNT. PROC is the process to the FTP-client."]) (defvar ange-ftp-hash-mark-msgs "[hH]ash mark [^0-9]*\\([0-9]+\\)" "\ *Regexp matching the FTP client's output upon doing a HASH command.") (defalias (quote ange-ftp-guess-hash-mark-size) #[(proc) "H\n!q\n\"@ A  ʎ\f\"FΔΕO!\"E)." [ange-ftp-send-hash process-buffer proc ange-ftp-raw-send-cmd "hash" status result line match-data match-data ((store-match-data match-data)) string-match ange-ftp-hash-mark-msgs string-to-int 1 size ange-ftp-ascii-hash-mark-size ash -4 ange-ftp-hash-mark-unit ange-ftp-binary-hash-mark-size] 5]) (defalias 'ange-ftp-get-process #[(host user) " \n\" ! !> [ \n\"! \n\"! \f \n # !B \n\f %L \n\f % ! \n\"!* *" [ange-ftp-ftp-process-buffer host user name get-process proc process-status (run open) ange-ftp-quote-string ange-ftp-get-passwd ange-ftp-get-account account pass ange-ftp-start-process ange-ftp-use-smart-gateway-p ange-ftp-smart-login ange-ftp-normal-login ange-ftp-guess-hash-mark-size ange-ftp-guess-host-type run-hooks ange-ftp-process-startup-hook] 7 "\ Return an FTP subprocess connected to HOST and logged in as USER. Create a new process if needed."]) (byte-code "!!‡" [boundp ange-ftp-host-cache nil ange-ftp-host-type-cache] 2) (defalias 'ange-ftp-host-type #[(host &optional user) " =\n  \" =\n!'ƂX!7!7ɂX!G!G˂X!W!W͂XΉ" [host ange-ftp-host-cache ange-ftp-host-type-cache user ange-ftp-get-process ange-ftp-dumb-unix-host dumb-unix fboundp ange-ftp-vms-host vms ange-ftp-mts-host mts ange-ftp-cms-host cms unix] 3 "\ Return a symbol which represents the type of the HOST given. If the optional argument USER is given, attempts to guess the host-type by logging in as USER."]) (defvar ange-ftp-fix-name-func-alist nil "\ Alist saying how to convert file name to the host's syntax. Association list of ( TYPE . FUNC ) pairs, where FUNC is a routine which can change a UNIX file name into a name more suitable for a host of type TYPE.") (defvar ange-ftp-fix-dir-name-func-alist nil "\ Alist saying how to convert directory name to the host's syntax. Association list of ( TYPE . FUNC ) pairs, where FUNC is a routine which can change UNIX directory name into a directory name more suitable for a host of type TYPE.") (defvar ange-ftp-dumb-host-types (quote (dumb-unix)) "\ List of host types that can't take UNIX ls-style listing options.") (defalias 'ange-ftp-send-cmd #[(host user cmd &optional msg cont nowait) "@A@ \n ĉ \n \f \f8\n \" =|A>\f!\f8=e\f\"e\"e\fP\f> \f#\fA > \f!\f > ! = \f!\f ! ! \f\fPPQĉ#$\n \" \n  ())%)?(?$#B. " [cmd user host msg nil fix-name-func host-type cmd3 cmd2 ange-ftp-this-msg ange-ftp-this-host ange-ftp-this-user cmd1 cmd0 2 ange-ftp-host-type dir ange-ftp-fix-dir-name-func-alist identity 3 unix string-match "/$" "R" "." ange-ftp-dumb-host-types ls format "\"%s %s\"" ange-ftp-fix-name-func-alist (get delete mkdir rmdir cd) (append put chmod) rename symbol-name " " afsc-line afsc-result ange-ftp-raw-send-cmd ange-ftp-get-process #[(result line host user cmd msg cont nowait) "    # \"\n D %" [cont result afsc-result line afsc-line ange-ftp-call-cont ange-ftp-raw-send-cmd ange-ftp-get-process host user cmd msg #[(result line cont) "   #" [cont result afsc-result line afsc-line ange-ftp-call-cont] 4] nowait] 6] cont nowait] 12 "\ Find an ftp process connected to HOST logged in as USER and send it CMD. MSG is an optional status message to be output before and after issuing the command. See the documentation for ange-ftp-raw-send-cmd for a description of CONT and NOWAIT."]) (byte-code "PLJ" ["^[-A-Z0-9$*][-A-Z0-9$*]?[-A-Z0-9$*]?[-A-Z0-9$*]?[-A-Z0-9$*]?" "[-A-Z0-9$*]?[-A-Z0-9$*]?[-A-Z0-9$*]?\\.[0-9][0-9][0-9A-Z]$" ange-ftp-cms-name-template "^[-A-Z0-9_$]+:\\[[-A-Z0-9_$]+\\(\\.[-A-Z0-9_$]+\\)*\\]$" ange-ftp-vms-name-template "^[A-Z0-9._][A-Z0-9._][A-Z0-9._][A-Z0-9._]:$" ange-ftp-mts-name-template nil] 2) (defalias 'ange-ftp-guess-host-type #[(host user) " ! R=  ʎ \"\f@  G!!\fA\" !  \"] !  \"s !   \" !   !\"#A \" *  &#-= &\"? \"@  P&#!!)*" [ange-ftp-host-type host "/" user "/~" key host-type unix match-data match-data ((store-match-data match-data)) ange-ftp-get-pwd result dir nil fix-name-func message "Warning! Unable to get home directory" sit-for 1 string-match "^450 No current working directory defined$" ange-ftp-add-cms-host ange-ftp-host-cache cms ange-ftp-host-type-cache ange-ftp-vms-name-template ange-ftp-add-vms-host vms ange-ftp-mts-name-template ange-ftp-add-mts-host mts ange-ftp-cms-name-template ange-ftp-this-host ange-ftp-this-user ange-ftp-fix-name-func-alist reverse ange-ftp-put-hash-entry ange-ftp-expand-dir-hashtable ange-ftp-hash-entry-exists-p] 6 "\ Guess at the the host type of HOST. Works by doing a pwd and examining the directory syntax."]) (defalias (quote ange-ftp-dumb-unix-host) #[(host) " Î \"*" [ange-ftp-dumb-unix-host-regexp match-data match-data ((store-match-data match-data)) string-match host] 3]) (defalias 'ange-ftp-add-dumb-unix-host #[(host) " !? !  lj" [ange-ftp-dumb-unix-host host "^" regexp-quote "$" ange-ftp-dumb-unix-host-regexp "\\|" nil ange-ftp-host-cache] 5 "\ Interactively adds a given HOST to ange-ftp-dumb-unix-host-regexp." (list (read-string "Host: " (let ((name (or (buffer-file-name) default-directory))) (and name (car (ange-ftp-ftp-name name))))))]) (defvar ange-ftp-parse-list-func-alist nil "\ Alist saying how to parse directory listings for certain OS types. Association list of ( TYPE . FUNC ) pairs. The FUNC is a routine which can parse the output from a DIR listing for a host of type TYPE.") (defalias 'ange-ftp-ls #[(file lsargs parse &optional no-error wildcard) " !\n!'\f@\fA@\f8! \n! \" > ՘J #! i idi\" !  !# F F \n!\"$@(!q !!-!!! \"#0\n 2A !\"  )!5?! AP#).\n*!*" [ange-ftp-expand-file-name file ange-ftp-this-file ange-ftp-ftp-name parsed host user ange-ftp-quote-string 2 name directory-file-name key ange-ftp-host-type host-type ange-ftp-dumb-host-types dumb nil result temp lscmd parse-func "" ange-ftp-real-file-name-as-directory ange-ftp-expand-dir "~" ange-ftp-ls-cache-file lsargs ange-ftp-ls-cache-lsargs ange-ftp-ls-cache-res ange-ftp-make-tmp-name wildcard ange-ftp-cd file-name-directory dir ((ange-ftp-del-tmp-name temp)) ange-ftp-send-cmd format "Listing %s" ange-ftp-abbreviate-filename get-buffer-create ange-ftp-data-buffer-name erase-buffer ange-ftp-real-file-readable-p ange-ftp-real-insert-file-contents sleep-for ange-ftp-retry-time ange-ftp-error "list data file %s not readable" parse ange-ftp-set-files ange-ftp-parse-list-func-alist ange-ftp-parse-dired-listing buffer-string no-error "DIR failed: " error "Should never happen. Please report. Bug ref. no.: 1"] 9 "\ Return the output of an `DIR' or `ls' command done over ftp. FILE is the full name of the remote file, LSARGS is any args to pass to the `ls' command, and PARSE specifies that the output should be parsed and stored away in the internal cache."]) (byte-code "PÇ" [" \\(Jan\\|Feb\\|Mar\\|Apr\\|May\\|Jun\\|Jul\\|Aug\\|Sep\\|Oct" "\\|Nov\\|Dec\\) +[0-3]?[0-9] " ange-ftp-date-regexp nil] 2) (defvar ange-ftp-add-file-entry-alist nil "\ Alist saying how to add file entries on certain OS types. Association list of pairs ( TYPE . FUNC ), where FUNC is a function to be used to add a file entry for the OS TYPE. The main reason for this alist is to deal with file versions in VMS.") (defvar ange-ftp-delete-file-entry-alist nil "\ Alist saying how to delete files on certain OS types. Association list of pairs ( TYPE . FUNC ), where FUNC is a function to be used to delete a file entry for the OS TYPE. The main reason for this alist is to deal with file versions in VMS.") (defalias 'ange-ftp-add-file-entry #[(name &optional dir-p) "\n!@! A \n \"Ɖ" [ange-ftp-host-type ange-ftp-ftp-name name ange-ftp-add-file-entry-alist ange-ftp-internal-add-file-entry dir-p nil ange-ftp-ls-cache-file] 3 "\ Add a file entry for file NAME, if its directory info exists."]) (defalias 'ange-ftp-delete-file-entry #[(name &optional dir-p) "\n!@! A \n \"Ɖ" [ange-ftp-host-type ange-ftp-ftp-name name ange-ftp-delete-file-entry-alist ange-ftp-internal-delete-file-entry dir-p nil ange-ftp-ls-cache-file] 3 "\ Delete the file entry for file NAME, if its directory info exists."]) (byte-code "\"\"" [defalias ange-ftp-parse-filename (macro . #[nil "" [(let ((eol (progn (end-of-line) (point)))) (beginning-of-line) (if (re-search-forward ange-ftp-date-regexp eol t) (progn (skip-chars-forward " ") (skip-chars-forward "^ " eol) (skip-chars-forward " " eol) (buffer-substring (point) eol))))] 1]) ange-ftp-ls-parser (macro . #[nil "" [(let ((tbl (ange-ftp-make-hashtable)) (used-F (and (stringp switches) (string-match "F" switches))) file-type symlink directory file) (while (setq file (ange-ftp-parse-filename)) (beginning-of-line) (skip-chars-forward " 0-9") (setq file-type (following-char) directory (eq file-type 100)) (if (eq file-type 108) (if (string-match " -> " file) (setq symlink (substring file (match-end 0)) file (substring file 0 (match-beginning 0))) (setq symlink "")) (setq symlink nil)) (if (and used-F (not (string-equal file "")) (looking-at ".[-r][-w]\\([^ ]\\)[-r][-w]\\([^ ]\\)[-r][-w]\\([^ ]\\)")) (let ((socket (eq file-type 115)) (executable (and (not symlink) (string-match "[xst]" (concat (buffer-substring (match-beginning 1) (match-end 1)) (buffer-substring (match-beginning 2) (match-end 2)) (buffer-substring (match-beginning 3) (match-end 3))))))) (if (or (and symlink (string-match "@$" file)) (and directory (string-match "/$" file)) (and executable (string-match "*$" file)) (and socket (string-match "=$" file))) (setq file (substring file 0 -1))))) (ange-ftp-put-hash-entry file (or symlink directory) tbl) (forward-line 1)) (ange-ftp-put-hash-entry "." t tbl) (ange-ftp-put-hash-entry ".." t tbl) tbl)] 1])] 3) (defvar ange-ftp-dl-dir-regexp nil "\ Regexp matching directories which are listed in dl format. This regexp should not be anchored with a trailing `$', because it should match subdirectories as well.") (defalias 'ange-ftp-add-dl-dir #[(dir) "\n\"?\n!R" [ange-ftp-dl-dir-regexp string-match dir "^" regexp-quote "\\|"] 4 "\ Interactively adds a DIR to ange-ftp-dl-dir-regexp." (list (read-string "Directory: " (let ((name (or (buffer-file-name) default-directory))) (and name (ange-ftp-ftp-name name) (file-name-directory name)))))]) (byte-code "\"\"" [defalias ange-ftp-dl-parser (macro . #[nil "" [(let ((tbl (ange-ftp-make-hashtable))) (while (not (eobp)) (ange-ftp-put-hash-entry (buffer-substring (point) (progn (skip-chars-forward "^ /\n") (point))) (eq (following-char) 47) tbl) (forward-line 1)) (ange-ftp-put-hash-entry "." t tbl) (ange-ftp-put-hash-entry ".." t tbl) tbl)] 1]) ange-ftp-parse-dired-listing #[(&optional switches) " Ž!0yly ;\"\"ʉ \f `y#Wwww`{) ywg=\f= \" ҕO  ҉O    ܘ!= ?Ŕŕ{{{Q\"\"#  \"\f \"\" \"# \" O *  \f#y2##.!:ʂmBʂ#iy ;[\"ʉ \f `y#www`{) Tywg=\f= \" ҕO  ҉O   @ ܘ@!@= ?Ŕŕ{{{Q\"\"#  \"8\f \"8\"+ \"8#? \"? O *  J\f#yk##.#/!y m`w`{g=#y}##)*" [match-data match-data ((store-match-data match-data)) looking-at "^total [0-9]+$" 1 ange-ftp-make-hashtable switches string-match "F" nil file directory symlink file-type used-F tbl eol 0 re-search-forward ange-ftp-date-regexp t " " "^ " " 0-9" 100 108 " -> " "" ".[-r][-w]\\([^ ]\\)[-r][-w]\\([^ ]\\)[-r][-w]\\([^ ]\\)" 115 "[xst]" 2 3 executable socket "@$" "/$" "*$" "=$" -1 ange-ftp-put-hash-entry "." ".." "[^\n]+\\( not found\\|: Not a directory\\)\n\\'" "^[^ \n ]+ +\\([0-9]+\\|-\\|=\\) " ange-ftp-add-dl-dir ange-ftp-this-file "^ /\n" 47] 8]] 3) (defalias 'ange-ftp-set-files #[(directory files) " !\f#" [files ange-ftp-put-hash-entry file-name-as-directory directory ange-ftp-files-hashtable] 4 "\ For a given DIRECTORY, set or change the associated FILES hashtable."]) (defalias 'ange-ftp-get-files #[(directory &optional no-error) " ! \"q Ǝ !; ;; \"; \"; \"; e!d;d\"d\"d\"de$p \"*" [file-name-as-directory directory ange-ftp-get-hash-entry ange-ftp-files-hashtable match-data match-data ((store-match-data match-data)) ange-ftp-ls boundp dired-actual-switches string-match "[aA]" "l" "R" dired-listing-switches "-al" t no-error] 5 "\ Given a given DIRECTORY, return a hashtable of file entries. This will give an error or return nil, depending on the value of NO-ERROR, if a listing for DIRECTORY cannot be obtained."]) (byte-code "\"\"" [defalias ange-ftp-get-file-part (macro . #[(name) " DDCBB" [let file file-name-nondirectory name ((if (string-equal file "") "." file))] 4]) ange-ftp-allow-child-lookup (macro . #[(dir file) " D DBBBBD" [not let* efile file edir dir ((parsed (ange-ftp-ftp-name edir)) (host-type (ange-ftp-host-type (car parsed)))) ((or (and (eq host-type (quote vms)) (string-match "\\." efile)) (and (memq host-type (quote (mts cms))) (not (string-equal "/" (nth 2 parsed))))))] 5])] 3) (defalias 'ange-ftp-file-entry-p #[(name) " ! ! \" !ɘʂ)0\"}\f   !@!=R\f\"`>`8ט?,v \"v\"} !\"," [directory-file-name name file-name-directory dir ange-ftp-get-hash-entry ange-ftp-files-hashtable ent file-name-nondirectory file "" "." ange-ftp-hash-entry-exists-p efile edir ange-ftp-ftp-name parsed ange-ftp-host-type host-type vms string-match "\\." (mts cms) 2 "/" ange-ftp-get-files t] 5 "\ Given NAME, return whether there is a file entry for it."]) (defalias 'ange-ftp-get-file-entry #[(name) " ! ! \" !ɘʂ)0\"} \f\f!@!=R \"`>`8֘?,v \"v\"} !\"," [directory-file-name name file-name-directory dir ange-ftp-get-hash-entry ange-ftp-files-hashtable ent file-name-nondirectory file "" "." efile edir ange-ftp-ftp-name parsed ange-ftp-host-type host-type vms string-match "\\." (mts cms) 2 "/" ange-ftp-get-files t] 5 "\ Given NAME, return the given file entry. The entry will be either t for a directory, nil for a normal file, or a string for a symlink. If the file isn't in the hashtable, this also returns nil."]) (byte-code "\"\"" [defalias ange-ftp-internal-delete-file-entry #[(name &optional dir-p) "\n!\n\f\"\n!\n!\f\"3\n!\n˘-̂/\n)\")" [dir-p file-name-as-directory name ange-ftp-del-hash-entry ange-ftp-files-hashtable directory-file-name ange-ftp-get-hash-entry file-name-directory files file-name-nondirectory file "" "."] 4] ange-ftp-internal-add-file-entry #[(name &optional dir-p) "\n!\n! \"+\n! ʘ$˂& )#)" [dir-p directory-file-name name ange-ftp-get-hash-entry file-name-directory ange-ftp-files-hashtable files ange-ftp-put-hash-entry file-name-nondirectory file "" "."] 5]] 3) (defalias 'ange-ftp-wipe-file-entries #[(host user) " G! \"\n)" [ange-ftp-make-hashtable ange-ftp-files-hashtable new-tbl ange-ftp-map-hashtable #[(key val) " !$\n@\nA@ \f #  #*)" [ange-ftp-ftp-name key parsed u h host user ange-ftp-put-hash-entry val new-tbl] 5]] 3 "\ Get rid of entry for HOST, USER pair from file entry information hashtable."]) (defalias 'ange-ftp-set-binary-mode #[(host user) " \n#@ \n\fAP#( \n\"!q\n\"\f))" [ange-ftp-send-cmd host user (type "binary") result ange-ftp-error "BINARY failed: " process-buffer ange-ftp-get-process ash ange-ftp-binary-hash-mark-size -4 ange-ftp-hash-mark-unit] 6 "\ Tell the ftp process for the given HOST & USER to switch to binary mode."]) (defalias 'ange-ftp-set-ascii-mode #[(host user) " \n#@ \n\fAP#( \n\"!q\n\"\f))" [ange-ftp-send-cmd host user (type "ascii") result ange-ftp-error "ASCII failed: " process-buffer ange-ftp-get-process ash ange-ftp-ascii-hash-mark-size -4 ange-ftp-hash-mark-unit] 6 "\ Tell the ftp process for the given HOST & USER to switch to ascii mode."]) (defalias (quote ange-ftp-cd) #[(host user dir) " \n\fD$@ \nAP#)" [ange-ftp-send-cmd host user cd dir "Doing CD" result ange-ftp-error "CD failed: "] 6]) (defalias 'ange-ftp-get-pwd #[(host user) " \n$A @3 \nˎ\")\"2ϔϕO*+B" [ange-ftp-send-cmd host user (pwd) "Getting PWD" result line nil dir match-data match-data ((store-match-data match-data)) string-match "\"\\([^\"]*\\)\"" " \\([^ ]+\\) " 1] 6 "\ Attempts to get the current working directory for the given HOST/USER pair. Returns ( DIR . LINE ) where DIR is either the directory or NIL if not found, and LINE is the relevant success or fail line from the FTP-client."]) (defalias 'ange-ftp-expand-dir #[(host user dir) " \n\"\fA \n\n\" \n̘a\n͘a =aQ \nE\"$A\"^ڔڕO + ۘw \n\"@ \n#ߎ \n# \n\"@ * \n !\"  \"  \n#* ," [ange-ftp-host-type host user host-type ange-ftp-fix-name-func-alist fix-name-func "/" dir key ange-ftp-get-hash-entry ange-ftp-expand-dir-hashtable res "anonymous" "ftp" unix ange-ftp-expand-dir-regexp "\\|" ange-ftp-good-msgs ange-ftp-send-cmd get "/dev/null" format "expanding %s" result line string-match 1 "~" ange-ftp-get-pwd ange-ftp-expand-dir home ((ange-ftp-cd host user home)) ange-ftp-cd ange-ftp-this-host ange-ftp-this-user reverse ange-ftp-put-hash-entry] 8 "\ Return the result of doing a PWD in the current FTP session. Use the connection to machine HOST logged in as user USER and cd'd to directory DIR."]) (defalias 'ange-ftp-canonize-filename #[(n) "\n\"\nÕSO\n!@A@8 \n\"\"nÔÕO ÕO\n  #aPj O\"+\n #!P!)\"!\"O\n\"+\n!=\n!\n!\n!\")" [string-match "[^:]+//" n 0 nil ange-ftp-ftp-name parsed 2 name user host "^/" "^~[^/]*" tilda rest ange-ftp-expand-dir dir error "User \"%s\" is not known" 1 "~" ange-ftp-real-file-name-as-directory "Unable to obtain CWD" "^//" ange-ftp-real-expand-file-name ange-ftp-replace-name-component string-to-char 47 ange-ftp-real-file-name-nondirectory ange-ftp-real-file-name-directory] 6 "\ Take a string and short-circuit //, /. and /.."]) (defalias 'ange-ftp-expand-file-name #[(name &optional default) " Ž\f!=1\f\"\fȕSO.\f\"1\fȕSO \f!=?\f!m\f!=M\f!m\fGU`\\!mi!\fP!*" [match-data match-data ((store-match-data match-data)) string-to-char name 47 string-match "[^:]+//" 0 nil "/~" 126 ange-ftp-real-expand-file-name ange-ftp-canonize-filename default default-directory file-name-as-directory] 3 "\ Documented as original."]) (defvar ange-ftp-file-name-as-directory-alist nil "\ Association list of ( TYPE . FUNC ) pairs. FUNC converts a filename to a directory name for the operating system TYPE.") (defalias 'ange-ftp-file-name-as-directory #[(name) " !%\n8Ę (\n@!A !( !)" [ange-ftp-ftp-name name parsed 2 "" ange-ftp-host-type ange-ftp-file-name-as-directory-alist ange-ftp-real-file-name-as-directory] 3 "\ Documented as original."]) (defalias 'ange-ftp-file-name-directory #[(name) " !(\n8 ǎ\f\"* $ \f!\")+ !)" [ange-ftp-ftp-name name parsed 2 filename match-data match-data ((store-match-data match-data)) string-match "^~[^/]*$" ange-ftp-replace-name-component ange-ftp-real-file-name-directory] 5 "\ Documented as original."]) (defalias 'ange-ftp-file-name-nondirectory #[(name) " !%\n8 ǎ\f\"*ʂ! !)( !)" [ange-ftp-ftp-name name parsed 2 filename match-data match-data ((store-match-data match-data)) string-match "^~[^/]*$" "" ange-ftp-real-file-name-nondirectory] 4 "\ Documented as original."]) (defalias 'ange-ftp-directory-file-name #[(dir) " ! \n8!\" !)" [ange-ftp-ftp-name dir parsed ange-ftp-replace-name-component ange-ftp-real-directory-file-name 2] 6 "\ Documented as original."]) (byte-code "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" [defalias ange-ftp-binary-file #[(file) " Ž\f \"*" [match-data match-data ((store-match-data match-data)) string-match ange-ftp-binary-file-name-regexp file] 3] ange-ftp-write-region #[(start end filename &optional append visit) " ! ! @ A@ 8!\f!\n !\f -͂. !Ҏ ؎\n%,\fZ\f \"\n! m\f  8#)\f \nE\"$&@&A\" E\"*=! !\" !.  %)" [expand-file-name filename ange-ftp-ftp-name parsed host user ange-ftp-quote-string 2 name ange-ftp-make-tmp-name temp ange-ftp-binary-file binary append put cmd ange-ftp-abbreviate-filename abbr ((byte-code " !\n \f \"" [ange-ftp-del-tmp-name temp binary ange-ftp-set-ascii-mode host user] 3)) t buffer-file-name buffer-modified-p mod-p executing-macro ((byte-code " !" [filename buffer-file-name set-buffer-modified-p mod-p] 2)) ange-ftp-real-write-region start end nil visit ange-ftp-set-binary-mode file-attributes attr ange-ftp-set-xfer-size 7 ange-ftp-send-cmd format "Writing %s" result signal ftp-error "Opening output file" "FTP Error: \"%s\"" set-visited-file-modtime (0 0) ange-ftp-set-buffer-mode set-buffer-modified-p ange-ftp-message "Wrote %s" ange-ftp-add-file-entry] 8] ange-ftp-insert-file-contents #[(filename &optional visit beg end replace) " \n!\n! \n\n!- \n!\f\"\n!\f@ \fA@\f8! !\n!\n!َ^ \" E\"$@A\"\nE\")!&!! ()*%A@\n\"D\") !\n\n.D\nD\"\n ()*%)" [barf-if-buffer-read-only expand-file-name filename ange-ftp-ftp-name parsed visit buffer-file-name file-exists-p nil ange-ftp-ls-cache-file ange-ftp-del-hash-entry file-name-directory ange-ftp-files-hashtable host user ange-ftp-quote-string 2 name ange-ftp-make-tmp-name temp ange-ftp-binary-file binary ange-ftp-abbreviate-filename abbr size ((byte-code " \n \" !" [binary ange-ftp-set-ascii-mode host user ange-ftp-del-tmp-name temp] 3)) ange-ftp-set-binary-mode ange-ftp-send-cmd get format "Retrieving %s" result signal ftp-error "Opening input file" "FTP Error: \"%s\"" ange-ftp-real-file-readable-p sleep-for ange-ftp-retry-time ange-ftp-real-insert-file-contents beg end replace "Opening input file:" "FTP Error: %s not arrived or readable" set-visited-file-modtime (0 0) file-error] 8] ange-ftp-expand-symlink #[(file dir) " ! \" \"" [file-name-absolute-p file ange-ftp-replace-name-component dir expand-file-name] 3] ange-ftp-file-symlink-p #[(file) " ! != !ŘƂ ) !!\" ;; !9 ! \"; ) !" [ange-ftp-expand-file-name file ange-ftp-ftp-name ange-ftp-get-hash-entry file-name-nondirectory "" "." ange-ftp-get-files file-name-directory file-ent file-name-absolute-p ange-ftp-replace-name-component ange-ftp-real-file-symlink-p] 6] ange-ftp-file-exists-p #[(name) " ! !) !, !;& !!\"!') !" [expand-file-name name ange-ftp-ftp-name ange-ftp-file-entry-p ange-ftp-get-file-entry file-ent file-exists-p ange-ftp-expand-symlink file-name-directory directory-file-name t ange-ftp-real-file-exists-p] 7] ange-ftp-file-directory-p #[(name) " ! !% !!;\" !!\"!# ) !" [expand-file-name name ange-ftp-ftp-name ange-ftp-get-file-entry ange-ftp-file-name-as-directory file-ent file-directory-p ange-ftp-expand-symlink file-name-directory directory-file-name ange-ftp-real-file-directory-p] 7] ange-ftp-directory-files #[(directory &optional full match &rest v19-args) " ! !^ ! !!Ɖ ! \f͎ X @ A B\"%N PPB%*+ %" [expand-file-name directory ange-ftp-ftp-name ange-ftp-barf-if-not-directory ange-ftp-hash-table-keys ange-ftp-get-files nil f files tail file-name-as-directory match-data match-data ((store-match-data match-data)) match string-match full apply ange-ftp-real-directory-files v19-args] 6] ange-ftp-file-attributes #[(file) " ! ! !ŘƂ ) !! \n\n \" @ A@ 8\n \";[![ !\"]ԉ;n؂xwقxP\"\"!\"\"ԯ\f,* !)" [expand-file-name file ange-ftp-ftp-name parsed file-name-nondirectory "" "." ange-ftp-get-files file-name-directory files part ange-ftp-hash-entry-exists-p 2 ange-ftp-get-hash-entry dirp name user host file-name-absolute-p ange-ftp-expand-symlink -1 (0 0) (0 0) (0 0) "l" "d" "-" "?????????" nil apply + mapcar identity directory-file-name ange-ftp-real-file-attributes] 18] ange-ftp-file-writable-p #[(file) " ! ! ! !! !" [expand-file-name file ange-ftp-ftp-name file-exists-p file-directory-p file-name-directory ange-ftp-real-file-writable-p] 3] ange-ftp-file-readable-p #[(file) " ! ! ! !" [expand-file-name file ange-ftp-ftp-name file-exists-p ange-ftp-real-file-readable-p] 2] ange-ftp-file-executable-p #[(file) " ! ! ! !" [expand-file-name file ange-ftp-ftp-name file-exists-p ange-ftp-real-file-executable-p] 2] ange-ftp-delete-file #[(file) " ! !G @ A@ 8! !\n\f D\n\"$@@A\" E\" !-J !)" [expand-file-name file ange-ftp-ftp-name parsed host user ange-ftp-quote-string 2 name ange-ftp-abbreviate-filename abbr ange-ftp-send-cmd delete format "Deleting %s" result signal ftp-error "Removing old name" "FTP Error: \"%s\"" ange-ftp-delete-file-entry ange-ftp-real-delete-file] 8 nil "fDelete file: "] ange-ftp-verify-visited-file-modtime #[(buf) " !;\n!Ă !)" [buffer-file-name buf name ange-ftp-ftp-name t ange-ftp-real-verify-visited-file-modtime] 3] ange-ftp-barf-or-query-if-file-exists #[(absname querystring interactive) " !!\n C\" #!?! C\"" [file-exists-p absname interactive signal file-already-exists yes-or-no-p format "File %s already exists; %s anyway? " querystring] 5] ange-ftp-copy-file-internal #[(filename newname ok-if-already-exists keep-date &optional msg cont nowait) " !\n!\n! !\n\" !\n!?? \n \n$ U #UG@RA@_8! !n@yA@8!\n \" !\n!  \n #.!!\"\nE&\"# \n& ++&S \n&܉ +&. *" [expand-file-name filename newname file-directory-p file-name-nondirectory ange-ftp-ftp-name t-parsed f-parsed ange-ftp-real-copy-file ok-if-already-exists keep-date cont ange-ftp-call-cont t "Copied locally" f-host f-user ange-ftp-quote-string 2 f-name ange-ftp-abbreviate-filename f-abbr t-host t-user t-name t-abbr ange-ftp-binary-file binary nil temp1 temp2 ange-ftp-barf-or-query-if-file-exists "copy to it" ange-ftp-use-gateway-p ange-ftp-make-tmp-name ange-ftp-set-binary-mode ange-ftp-send-cmd get msg format "Getting %s" "Copying %s to %s" ange-ftp-cf1 nowait] 25] ange-ftp-cf1 #[(result line filename newname binary msg f-parsed f-host f-user f-name f-abbr t-parsed t-host t-user t-name t-abbr temp1 temp2 cont nowait) "#\n\"  ! \"\" E\")\n\f!9! `X Nm #m mm #y\" !8#) E!\"#$#!  &&!  & \n#" [line ((byte-code " \n \"" [binary ange-ftp-set-ascii-mode f-host f-user] 3)) result temp1 ange-ftp-del-tmp-name cont signal ftp-error "Opening input file" format "FTP Error: \"%s\"" filename t-parsed ange-ftp-use-gateway-p t-host ange-ftp-make-tmp-name temp2 nil ange-ftp-real-copy-file t binary ange-ftp-set-binary-mode t-user file-attributes attr ange-ftp-set-xfer-size 7 ange-ftp-send-cmd put t-name msg f-parsed "Putting %s" newname "Copying %s to %s" f-abbr t-abbr ange-ftp-cf2 nowait ange-ftp-call-cont] 14] ange-ftp-cf2 #[(result line newname t-host t-user binary temp1 temp2 cont) " $Ž \f \"\nE\"\n!)0\f0\f\n#)" [((byte-code "!\n\n!\f #" [temp1 ange-ftp-del-tmp-name temp2 ange-ftp-call-cont cont result line] 4)) line ((byte-code " \n \"" [binary ange-ftp-set-ascii-mode t-host t-user] 3)) result cont signal ftp-error "Opening output file" format "FTP Error: \"%s\"" newname ange-ftp-add-file-entry temp1 ange-ftp-real-copy-file t] 6] ange-ftp-copy-file #[(filename newname &optional ok-if-already-exists keep-date) " \n \fʼnt&" [ange-ftp-copy-file-internal filename newname ok-if-already-exists keep-date nil] 8 nil "fCopy file: \nFCopy %s to file: \np"]] 3) (defalias 'ange-ftp-rename-remote-to-remote #[(filename newname f-parsed t-parsed binary) "@A@ @ A@ p\f\np8! 8!  E  ! \" \f #$@bA\" F\"! !.} $ !," [f-parsed t-parsed t-user t-host f-user f-host ange-ftp-quote-string 2 f-name t-name rename cmd ange-ftp-abbreviate-filename filename fabbr newname nabbr ange-ftp-send-cmd format "Renaming %s to %s" result signal ftp-error "Renaming" "FTP Error: \"%s\"" ange-ftp-add-file-entry ange-ftp-delete-file-entry ange-ftp-copy-file-internal t nil delete-file] 9 "\ Rename remote file FILE to remote file NEWNAME."]) (defalias 'ange-ftp-rename-local-to-remote #[(filename newname) " ! \"\n\f# % !," [ange-ftp-abbreviate-filename filename fabbr newname nabbr format "Renaming %s to %s" msg ange-ftp-copy-file-internal t nil ange-ftp-process-verbose delete-file] 6 "\ Rename local FILENAME to remote file NEWNAME."]) (defalias 'ange-ftp-rename-remote-to-local #[(filename newname) " ! \"\n\f# % !," [ange-ftp-abbreviate-filename filename fabbr newname nabbr format "Renaming %s to %s" msg ange-ftp-copy-file-internal t nil ange-ftp-process-verbose delete-file] 6 "\ Rename remote file FILENAME to local file NEWNAME."]) (byte-code "\"\"\"\"\"\"\"\"\"\"\"\"" [defalias ange-ftp-rename-file #[(filename newname &optional ok-if-already-exists) " !\n! !\n!\f  !\f% 808\n#\fR K \n\f %c \n\"c ] \n\"c \n#+" [expand-file-name filename newname ange-ftp-ftp-name f-parsed t-parsed ange-ftp-binary-file binary ok-if-already-exists ange-ftp-barf-or-query-if-file-exists "rename to it" ange-ftp-rename-remote-to-remote ange-ftp-rename-remote-to-local ange-ftp-rename-local-to-remote ange-ftp-real-rename-file] 6 nil "fRename file: \nFRename %s to file: \np"] ange-ftp-file-entry-active-p #[(sym) "N;? \f\"!)" [sym val file-exists-p ange-ftp-expand-symlink ange-ftp-this-dir] 5] ange-ftp-file-entry-not-ignored-p #[(sym) "N!;+ \"!'!'\n \"?)5 5\n \"?*" [sym val symbol-name symname ange-ftp-expand-symlink ange-ftp-this-dir file file-directory-p file-exists-p string-match ange-ftp-completion-ignored-pattern] 4] ange-ftp-file-name-all-completions #[(file dir) " !\n!)\n!\n!\n! #  \"*C\nΘ> \" \n\"C \n\")" [expand-file-name dir ange-ftp-this-dir ange-ftp-ftp-name ange-ftp-barf-if-not-directory ange-ftp-real-file-name-as-directory ange-ftp-get-files tbl all-completions file ange-ftp-file-entry-active-p completions mapcar #[(file) " \n\" ; \"! P )" [ange-ftp-get-hash-entry file tbl ent file-directory-p ange-ftp-expand-symlink ange-ftp-this-dir "/"] 5] "/" ange-ftp-generate-root-prefixes ange-ftp-real-file-name-all-completions] 4] ange-ftp-file-name-completion #[(file dir) " !\n!D\n! ƚƂ^\n!\n! \f# ю  \n$@  \n$,^\n՘Z \"\"\"^ \n\")" [expand-file-name dir ange-ftp-this-dir ange-ftp-ftp-name ange-ftp-barf-if-not-directory file "" ange-ftp-real-file-name-as-directory ange-ftp-get-files tbl mapconcat #[(s) "; !PÇ" [s regexp-quote "$" "/"] 2] completion-ignored-extensions "\\|" ange-ftp-completion-ignored-pattern match-data match-data ((store-match-data match-data)) ange-ftp-file-name-completion-1 ange-ftp-file-entry-not-ignored-p ange-ftp-file-entry-active-p "/" try-completion ange-ftp-generate-root-prefixes mapcar list ange-ftp-real-file-name-all-completions ange-ftp-real-file-name-completion] 8] ange-ftp-file-name-completion-1 #[(file tbl dir predicate) " \n #?\f=$ \"! P?ł?\f\n #=>\f\"!>\fP?\f)" [try-completion file tbl predicate bestmatch t file-directory-p expand-file-name dir "/"] 5] ange-ftp-re-read-dir #[(&optional dir) " ! !!!%\"\"" [dir expand-file-name file-name-directory buffer-string ange-ftp-ftp-name nil ange-ftp-ls-cache-file ange-ftp-del-hash-entry ange-ftp-files-hashtable ange-ftp-get-files t] 3 nil nil] ange-ftp-make-directory #[(dir &optional parents) " !!\f!\f\") !! \" !\n\n@ \nA@\f !=H\n8!N\n8!! ! \fD\"$@z \f A## \"- !)" [parents file-name-directory directory-file-name dir parent file-exists-p ange-ftp-make-directory error "Cannot make directory %s: file already exists" ange-ftp-ftp-name parsed host user ange-ftp-quote-string ange-ftp-host-type unix ange-ftp-real-directory-file-name 2 ange-ftp-real-file-name-as-directory name ange-ftp-abbreviate-filename abbr ange-ftp-send-cmd mkdir format "Making directory %s" result ange-ftp-error "Could not make directory %s: %s" ange-ftp-add-file-entry t ange-ftp-real-make-directory] 8 nil (list (expand-file-name (read-file-name "Make directory: ")))] ange-ftp-delete-directory #[(dir) " !` ![ @ A@\f!=& 8!+ 8!!\f !\f \fD\"$@S\f A## \"-^ !) \"" [file-directory-p dir ange-ftp-ftp-name parsed host user ange-ftp-quote-string ange-ftp-host-type unix ange-ftp-real-directory-file-name 2 ange-ftp-real-file-name-as-directory name ange-ftp-abbreviate-filename abbr ange-ftp-send-cmd rmdir format "Removing directory %s" result ange-ftp-error "Could not remove directory %s: %s" ange-ftp-delete-file-entry t ange-ftp-real-delete-directory error "Not a directory: %s"] 8] ange-ftp-file-local-copy #[(file) " !\n!&\f@!\n!\n\n\"%**" [expand-file-name file fn1 ange-ftp-ftp-name pa1 ange-ftp-make-tmp-name tmp1 ange-ftp-binary-file bin1 ange-ftp-copy-file-internal t nil format "Getting %s"] 9] ange-ftp-load #[(file &optional noerror nomessage nosuffix) " !O\n C P P E..ʏBˎ \n$)M M D\"*  \n$" [ange-ftp-ftp-name file nosuffix ".elc" ".el" nil copy tryfiles error (byte-code " @!" [ange-ftp-file-local-copy tryfiles copy] 2) ((ftp-error)) ((delete-file copy)) load noerror nomessage signal file-error "Cannot open load file" ange-ftp-real-load] 5] ange-ftp-unhandled-file-name-directory #[(filename) " !" [file-name-directory ange-ftp-tmp-name-template] 2]] 3) (defvar ange-ftp-make-compressed-filename-alist nil "\ Alist of host-type-specific functions to process file names for compression. Each element has the form (TYPE . FUNC). FUNC should take one argument, a file name, and return a list of the form (COMPRESSING NEWNAME). COMPRESSING should be t if the specified file should be compressed, and nil if it should be uncompressed (that is, if it is a compressed file). NEWNAME should be the name to give the new compressed or uncompressed file.") (byte-code "\"\"\"\" \"\" B  \"0 B >=B######################Ӂ@#сAӁB#сCӁD#сEӁF#сGӁH#сIӁJ#сKӁL#сMӁN#сO#сPӁQ#сRӁS#сTӁU#VW\"XY\"Z[\"\\]\"^_\"`a\"bc\"de\"fg\"hi\"jk\"lm\"no\"pq\"rs\"tu\"vw\"xy\"z{\"|}\"~\"\"\"\"\"\"\"\"\"\"F\"N\"" [defalias ange-ftp-dired-compress-file #[(name) " !C\f@!AC Ɏ !*\n@ \nA@\f : \f\"? \f\"+J !)*" [ange-ftp-ftp-name name nil conversion-func parsed ange-ftp-host-type ange-ftp-make-compressed-filename-alist match-data match-data ((store-match-data match-data)) decision compressing newfile ange-ftp-compress ange-ftp-uncompress file-name-handler-alist dired-compress-file] 4] ange-ftp-compress #[(file nfile) " !\n@!\n@! !! \"\f \"ώ \f\f%=\"``\f #&Y\" Uq !) %." [ange-ftp-ftp-name file parsed ange-ftp-make-tmp-name tmp1 tmp2 ange-ftp-abbreviate-filename abbr nfile nabbr format "Getting %s" msg1 "Putting %s" msg2 ((byte-code " !\n!" [ange-ftp-del-tmp-name tmp1 tmp2] 2)) ange-ftp-copy-file-internal t nil ange-ftp-process-verbose ange-ftp-message "Compressing %s..." call-process-region shell-file-name "-c" "compress -f -c < %s > %s" "Compressing %s...done" buffer-size 0 delete-file] 12] ange-ftp-uncompress #[(file nfile) " !\n@!\n@! !! \"\f \"ώ \f\f%=\"``\f #&Y\" Uq !) %." [ange-ftp-ftp-name file parsed ange-ftp-make-tmp-name tmp1 tmp2 ange-ftp-abbreviate-filename abbr nfile nabbr format "Getting %s" msg1 "Putting %s" msg2 ((byte-code " !\n!" [ange-ftp-del-tmp-name tmp1 tmp2] 2)) ange-ftp-copy-file-internal t nil ange-ftp-process-verbose ange-ftp-message "Uncompressing %s..." call-process-region shell-file-name "-c" "uncompress -c < %s > %s" "Uncompressing %s...done" buffer-size 0 delete-file] 12] ange-ftp-hook-function #[(operation &rest args) "N\n\f\"\f\")" [operation ange-ftp fn apply args ange-ftp-run-real-handler] 4] assoc "^/[^/:]*[^/:]:" file-name-handler-alist ("^/[^/:]*[^/:]:" . ange-ftp-hook-function) "^/[^/:]*\\'" ("^/[^/:]*\\'" . ange-ftp-completion-hook-function) ange-ftp-set-buffer-mode find-file-hooks put file-name-directory ange-ftp ange-ftp-file-name-directory file-name-nondirectory ange-ftp-file-name-nondirectory file-name-as-directory ange-ftp-file-name-as-directory directory-file-name ange-ftp-directory-file-name expand-file-name ange-ftp-expand-file-name make-directory ange-ftp-make-directory delete-directory ange-ftp-delete-directory insert-file-contents ange-ftp-insert-file-contents directory-files ange-ftp-directory-files file-directory-p ange-ftp-file-directory-p file-writable-p ange-ftp-file-writable-p file-readable-p ange-ftp-file-readable-p file-executable-p ange-ftp-file-executable-p file-symlink-p ange-ftp-file-symlink-p delete-file ange-ftp-delete-file read-file-name-internal ange-ftp-read-file-name-internal verify-visited-file-modtime ange-ftp-verify-visited-file-modtime file-exists-p ange-ftp-file-exists-p write-region ange-ftp-write-region backup-buffer ange-ftp-backup-buffer copy-file ange-ftp-copy-file rename-file ange-ftp-rename-file file-attributes ange-ftp-file-attributes file-name-all-completions ange-ftp-file-name-all-completions file-name-completion ange-ftp-file-name-completion insert-directory ange-ftp-insert-directory file-local-copy ange-ftp-file-local-copy unhandled-file-name-directory ange-ftp-unhandled-file-name-directory file-name-sans-versions ange-ftp-file-name-sans-versions dired-uncache ange-ftp-dired-uncache dired-compress-file load ange-ftp-load file-truename identity vc-registered null ange-ftp-run-real-handler #[(operation args) "\n = \fBB  \"*" [ange-ftp-hook-function ange-ftp-completion-hook-function inhibit-file-name-operation operation inhibit-file-name-handlers apply args] 4] ange-ftp-real-file-name-directory #[(&rest args) "\n\"" [ange-ftp-run-real-handler file-name-directory args] 3] ange-ftp-real-file-name-nondirectory #[(&rest args) "\n\"" [ange-ftp-run-real-handler file-name-nondirectory args] 3] ange-ftp-real-file-name-as-directory #[(&rest args) "\n\"" [ange-ftp-run-real-handler file-name-as-directory args] 3] ange-ftp-real-directory-file-name #[(&rest args) "\n\"" [ange-ftp-run-real-handler directory-file-name args] 3] ange-ftp-real-expand-file-name #[(&rest args) "\n\"" [ange-ftp-run-real-handler expand-file-name args] 3] ange-ftp-real-make-directory #[(&rest args) "\n\"" [ange-ftp-run-real-handler make-directory args] 3] ange-ftp-real-delete-directory #[(&rest args) "\n\"" [ange-ftp-run-real-handler delete-directory args] 3] ange-ftp-real-insert-file-contents #[(&rest args) "\n\"" [ange-ftp-run-real-handler insert-file-contents args] 3] ange-ftp-real-directory-files #[(&rest args) "\n\"" [ange-ftp-run-real-handler directory-files args] 3] ange-ftp-real-file-directory-p #[(&rest args) "\n\"" [ange-ftp-run-real-handler file-directory-p args] 3] ange-ftp-real-file-writable-p #[(&rest args) "\n\"" [ange-ftp-run-real-handler file-writable-p args] 3] ange-ftp-real-file-readable-p #[(&rest args) "\n\"" [ange-ftp-run-real-handler file-readable-p args] 3] ange-ftp-real-file-executable-p #[(&rest args) "\n\"" [ange-ftp-run-real-handler file-executable-p args] 3] ange-ftp-real-file-symlink-p #[(&rest args) "\n\"" [ange-ftp-run-real-handler file-symlink-p args] 3] ange-ftp-real-delete-file #[(&rest args) "\n\"" [ange-ftp-run-real-handler delete-file args] 3] ange-ftp-real-read-file-name-internal #[(&rest args) "\n\"" [ange-ftp-run-real-handler read-file-name-internal args] 3] ange-ftp-real-verify-visited-file-modtime #[(&rest args) "\n\"" [ange-ftp-run-real-handler verify-visited-file-modtime args] 3] ange-ftp-real-file-exists-p #[(&rest args) "\n\"" [ange-ftp-run-real-handler file-exists-p args] 3] ange-ftp-real-write-region #[(&rest args) "\n\"" [ange-ftp-run-real-handler write-region args] 3] ange-ftp-real-backup-buffer #[(&rest args) "\n\"" [ange-ftp-run-real-handler backup-buffer args] 3] ange-ftp-real-copy-file #[(&rest args) "\n\"" [ange-ftp-run-real-handler copy-file args] 3] ange-ftp-real-rename-file #[(&rest args) "\n\"" [ange-ftp-run-real-handler rename-file args] 3] ange-ftp-real-file-attributes #[(&rest args) "\n\"" [ange-ftp-run-real-handler file-attributes args] 3] ange-ftp-real-file-name-all-completions #[(&rest args) "\n\"" [ange-ftp-run-real-handler file-name-all-completions args] 3] ange-ftp-real-file-name-completion #[(&rest args) "\n\"" [ange-ftp-run-real-handler file-name-completion args] 3] ange-ftp-real-insert-directory #[(&rest args) "\n\"" [ange-ftp-run-real-handler insert-directory args] 3] ange-ftp-real-file-name-sans-versions #[(&rest args) "\n\"" [ange-ftp-run-real-handler file-name-sans-versions args] 3] ange-ftp-real-shell-command #[(&rest args) "\n\"" [ange-ftp-run-real-handler shell-command args] 3] ange-ftp-real-load #[(&rest args) "\n\"" [ange-ftp-run-real-handler load args] 3] #[(file switches &optional wildcard full) " ! !!\f1& ! ! ̉%)-  #c:  $*" [ange-ftp-abbreviate-filename file ange-ftp-ftp-name expand-file-name parsed short wildcard file-name-directory default-directory ange-ftp-ls file-name-nondirectory switches nil t full ange-ftp-real-insert-directory] 6] #[(dir) "\n!! É" [ange-ftp-ftp-name expand-file-name dir nil ange-ftp-ls-cache-file] 3]] 4) (defvar ange-ftp-sans-version-alist nil "\ Alist of mapping host type into function to remove file version numbers.") (defalias (quote ange-ftp-file-name-sans-versions) #[(file keep-backup-version) " ! !É!@!@!A\f-\f  \"2  \"+" [ange-ftp-abbreviate-filename file ange-ftp-ftp-name nil func host-type parsed ange-ftp-host-type ange-ftp-sans-version-alist keep-backup-version ange-ftp-real-file-name-sans-versions] 4]) (defvar ange-ftp-remote-shell-file-name (byte-code ">‡Ç" [system-type (hpux usg-unix-v) "remsh" "rsh"] 2) "\ Name of command to run a remote shell, for ange-ftp.") (byte-code "\"\"\"\"\n!\nB\n\f>.\fB\f\"@B!I\"" [defalias ange-ftp-shell-command #[(command) " !@\nA@\n8\n!@GV,R $\"!," [ange-ftp-ftp-name default-directory parsed host user 2 name ange-ftp-real-shell-command command 0 "cd " "; " format "%s %s \"%s\"" ange-ftp-remote-shell-file-name ange-ftp-message "Remote command '%s' ..."] 6] ange-ftp-dired-call-process #[(program discard &rest arguments) " ! ď ?\n&" [ange-ftp-ftp-name default-directory oops (byte-code "\n !\"" [program "chmod" ange-ftp-call-chmod arguments error "Unknown remote command: %s"] 3) ((ftp-error (byte-code "\nA@\n8\n8$c" [format "%s: %s, %s\n" oops 2 3] 6)) (error (byte-code "\nA@\"c" [format "%s\n" oops] 3))) apply call-process program nil discard arguments] 7] ange-ftp-call-chmod #[(args) "GW\f\"@A\")lj" [args 2 error "ange-ftp-call-chmod: missing mode and/or filename: %s" mode mapcar #[(file) " ! !A @ A@ 8! !\n\f  E\n\"$@@\f A##-)" [expand-file-name file ange-ftp-ftp-name parsed host user ange-ftp-quote-string 2 name ange-ftp-abbreviate-filename abbr ange-ftp-send-cmd chmod mode format "doing chmod %s" result ange-ftp-error "chmod: %s: \"%s\""] 8] nil ange-ftp-ls-cache-file] 3] ange-ftp-fix-name-for-vms #[(name &optional reverse) " Ž v\"nlj \n˔(˔˕O\n̔6̔̕O ͔D͔͕O V O\"\" \n`\nQ gR+\"lj \n\"ؕSO\nؕO!O\"\" !\n \n? RQ,*" [match-data match-data ((store-match-data match-data)) reverse string-match "^\\([^:]+:\\)?\\(\\[.*\\]\\)?\\([^][]*\\)$" name nil file dir drive 1 2 3 apply concat mapcar #[(char) "U\n!!" [char 46 vector 47] 2] -1 "/" error "name %s didn't match" tmp "^/[^:]+:/" 0 file-name-directory #[(char) "U\n!!" [char 47 vector 46] 2] file-name-nondirectory "[" "." "]"] 8] vms ange-ftp-fix-name-func-alist (vms . ange-ftp-fix-name-for-vms) ange-ftp-dumb-host-types ange-ftp-fix-dir-name-for-vms #[(dir-name) "\n!\"!!" [dir-name "/" error "Cannot get listing for fictitious \"/\" directory." string-match "^/[-A-Z0-9_$]+:/$" "Cannot get listing for device." ange-ftp-fix-name-for-vms] 3] ange-ftp-fix-dir-name-func-alist (vms . ange-ftp-fix-dir-name-for-vms) boundp ange-ftp-vms-host-regexp nil ange-ftp-vms-host #[(host) " Î \"*" [ange-ftp-vms-host-regexp match-data match-data ((store-match-data match-data)) string-match host] 3]] 3) (defconst ange-ftp-vms-filename-regexp (concat "\\(\\([_A-Za-z0-9$]?\\|[_A-Za-z0-9$][-_A-Za-z0-9$]*\\)\\." "[-_A-Za-z0-9$]*;+[0-9]*\\)") "\ Regular expression to match for a valid VMS file name in Dired buffer. Stupid freaking bug! Position of _ and $ shouldn't matter but they do. Having [A-Z0-9$_] bombs on filename _$$CHANGE_LOG$.TXT$ and $CHANGE_LOG$.TX Other orders of $ and _ seem to all work just fine.") (byte-code "\"\"B\"\n)\nB\n\";B" [defalias ange-ftp-parse-vms-filename #[nil " # Ĕĕ{" [re-search-forward ange-ftp-vms-filename-regexp nil t 0] 4] ange-ftp-parse-vms-listing #[nil " eb Ǝ E\n\"(\nˉO #?\n #\n\"?\nˉO #y # #* *" [ange-ftp-make-hashtable nil file tbl match-data match-data ((store-match-data match-data)) ange-ftp-parse-vms-filename string-match "\\.\\(DIR\\|dir\\);[0-9]+" ange-ftp-put-hash-entry 0 t ";[0-9]+$" 1 "." ".."] 4] vms ange-ftp-parse-list-func-alist (vms . ange-ftp-parse-vms-listing) ange-ftp-vms-delete-file-entry #[(name &optional dir-p) " \n\" Ǝ\n!ɘʂ)\"e\n!\"dщO!Q\"\"c\"+)+" [dir-p ange-ftp-internal-delete-file-entry name t match-data match-data ((store-match-data match-data)) file-name-nondirectory file "" "." string-match ";[0-9]+$" ange-ftp-get-hash-entry file-name-directory ange-ftp-files-hashtable files 0 root "^" regexp-quote regexp nil versions ange-ftp-del-hash-entry mapatoms #[(sym) " \nN\"\fĉ" [string-match regexp sym key t versions] 4]] 4] ange-ftp-delete-file-entry-alist (vms . ange-ftp-vms-delete-file-entry) ange-ftp-vms-add-file-entry #[(name &optional dir-p) " \n\"\n!\"v\n! ʘ%˂' )  Ύ \"G ҉O#m !Q\"T !Q#** #))" [dir-p ange-ftp-internal-add-file-entry name t ange-ftp-get-hash-entry file-name-directory ange-ftp-files-hashtable files file-name-nondirectory file "" "." match-data match-data ((store-match-data match-data)) string-match ";[0-9]+$" ange-ftp-put-hash-entry 0 nil "^" regexp-quote ";\\([0-9]+\\)$" version regexp mapatoms #[(sym) "N\f\n\" \nǔǕO!])" [sym key name string-match regexp version string-to-int 1] 5] ";" int-to-string] 6] ange-ftp-add-file-entry-alist (vms . ange-ftp-vms-add-file-entry)] 3) (defalias 'ange-ftp-add-vms-host #[(host) " !? !  lj" [ange-ftp-vms-host host "^" regexp-quote "$" ange-ftp-vms-host-regexp "\\|" nil ange-ftp-host-cache] 5 "\ Mark HOST as the name of a machine running VMS." (list (read-string "Host: " (let ((name (or (buffer-file-name) default-directory))) (and name (car (ange-ftp-ftp-name name))))))]) (byte-code "\"\f\fB\"!B\"\f3\fB\f\"EB\"WB>dB!m\"\"Bڇ" [defalias ange-ftp-vms-file-name-as-directory #[(name) " Ž \" ƉO !*" [match-data match-data ((store-match-data match-data)) string-match "\\.\\(DIR\\|dir\\)\\(;[0-9]+\\)?$" name 0 ange-ftp-real-file-name-as-directory] 3] vms ange-ftp-file-name-as-directory-alist (vms . ange-ftp-vms-file-name-as-directory) ange-ftp-vms-make-compressed-filename #[(name &optional reverse) "\n\"\nĉOD\n\"\nĉOD\n\",\nOD\n\">\nĉOPA\nPD" [string-match "-Z;[0-9]+$" name nil 0 ";[0-9]+$" "-Z$" -2 t "-Z"] 4] ange-ftp-make-compressed-filename-alist (vms . ange-ftp-vms-make-compressed-filename) ange-ftp-vms-sans-version #[(name) " Ž \" ƉO *" [match-data match-data ((store-match-data match-data)) string-match ";[0-9]+$" name 0] 3] ange-ftp-sans-version-alist (vms . ange-ftp-vms-sans-version) ange-ftp-fix-name-for-mts #[(name &optional reverse) " Ž K\"Clj ʔ$ʕO ̔2̔̕O < QP*f\"f\"dʉO̔̕OPf*" [match-data match-data ((store-match-data match-data)) reverse string-match "^\\([^:]+:\\)?\\(.*\\)$" name nil file acct 1 0 2 "/" error "name %s didn't match" "^/\\([^:]+:\\)/\\(.*\\)$"] 4] mts ange-ftp-fix-name-func-alist (mts . ange-ftp-fix-name-for-mts) ange-ftp-fix-dir-name-for-mts #[(dir-name) "\n!!ŘƂ&\"%P&)" [dir-name "/" error "Cannot get listing for fictitious \"/\" directory." ange-ftp-fix-name-for-mts "" "?" string-match ":$"] 4] ange-ftp-fix-dir-name-func-alist (mts . ange-ftp-fix-dir-name-for-mts) ange-ftp-dumb-host-types boundp ange-ftp-mts-host-regexp nil ange-ftp-mts-host #[(host) " Î \"*" [ange-ftp-mts-host-regexp match-data match-data ((store-match-data match-data)) string-match host] 3] ange-ftp-parse-mts-listing #[nil " eb Ď#2x`\nx`\n{ #)y * # )" [ange-ftp-make-hashtable tbl match-data match-data ((store-match-data match-data)) re-search-forward ange-ftp-date-regexp nil t " " end "-A-Z0-9_.!" ange-ftp-put-hash-entry 1 "."] 4] ange-ftp-parse-list-func-alist (mts . ange-ftp-parse-mts-listing)] 3) (defalias 'ange-ftp-add-mts-host #[(host) " !? !  lj" [ange-ftp-mts-host host "^" regexp-quote "$" ange-ftp-mts-host-regexp "\\|" nil ange-ftp-host-cache] 5 "\ Mark HOST as the name of a machine running MTS." (list (read-string "Host: " (let ((name (or (buffer-file-name) default-directory))) (and name (car (ange-ftp-ftp-name name))))))]) (byte-code "\"\f\fB>B\" . B " [defalias ange-ftp-fix-name-for-cms #[(name &optional reverse) " Ž  P \"~ ȉO ʔx ʔʕO P \"#@It \"#@es  A##)+z )!*" [match-data match-data ((store-match-data match-data)) reverse "/" name string-match "^/\\([-A-Z0-9$*._]+\\)/\\([-A-Z0-9$._]+\\)?$" 1 minidisk 2 "cd " ange-ftp-get-process ange-ftp-this-host ange-ftp-this-user proc cmd file ange-ftp-raw-send-cmd ange-ftp-this-msg result ange-ftp-error format "cd to minidisk %s failed: %s" error "Invalid CMS filename"] 8] cms ange-ftp-fix-name-func-alist (cms . ange-ftp-fix-name-for-cms) ange-ftp-dumb-host-types ange-ftp-fix-dir-name-for-cms #[(dir-name) "\n!\"rƔƕO \n\" P Δ5ΔΕO6  \"@Gp \n\"   \"@ao \nA##),!" [dir-name "/" error "Cannot get listing for fictitious \"/\" directory." string-match "^/\\([-A-Z0-9$*._]+\\)/\\([-A-Z0-9$._]+\\)?$" 1 minidisk ange-ftp-get-process ange-ftp-this-host ange-ftp-this-user proc "cd " cmd 2 "*" file ange-ftp-raw-send-cmd result ange-ftp-error format "cd to minidisk %s failed: " "Invalid CMS file name"] 8] ange-ftp-fix-dir-name-func-alist (cms . ange-ftp-fix-dir-name-for-cms)] 3) (defvar ange-ftp-cms-host-regexp nil "\ Regular expression to match hosts running the CMS operating system.") (defalias (quote ange-ftp-cms-host) #[(host) " Î \"*" [ange-ftp-cms-host-regexp match-data match-data ((store-match-data match-data)) string-match host] 3]) (defalias 'ange-ftp-add-cms-host #[(host) " !? !  lj" [ange-ftp-cms-host host "^" regexp-quote "$" ange-ftp-cms-host-regexp "\\|" nil ange-ftp-host-cache] 5 "\ Mark HOST as the name of a CMS host." (list (read-string "Host: " (let ((name (or (buffer-file-name) default-directory))) (and name (car (ange-ftp-ftp-name name))))))]) (byte-code "\"\f\fB\"!B!" [defalias ange-ftp-parse-cms-listing #[nil " eb Ď#*ʔʕ{̔̕{Q #y #* )" [ange-ftp-make-hashtable tbl match-data match-data ((store-match-data match-data)) re-search-forward "^\\([-A-Z0-9$_]+\\) +\\([-A-Z0-9$_]+\\) +[VF] +[0-9]+ " nil t ange-ftp-put-hash-entry 1 "." 2] 5] cms ange-ftp-parse-list-func-alist (cms . ange-ftp-parse-cms-listing) ange-ftp-cms-make-compressed-filename #[(name &optional reverse) "\n\"\nOD\nPD" [string-match "-Z$" name nil 0 -2 t "-Z"] 4] ange-ftp-make-compressed-filename-alist (cms . ange-ftp-cms-make-compressed-filename) provide ange-ftp] 3)