home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 2 / FFMCD02.bin / new / comm / net / amitcp / amitcp-2.2 / appl / emacstcp / lisp / gopher.elc < prev    next >
Encoding:
Text File  |  1993-12-21  |  15.5 KB  |  276 lines

  1.  
  2. (require (quote electric))
  3.  
  4. (defvar gopher-root-node (vector 49 "root" "" "otax.tky.hut.fi" 70) "\
  5. The root gopher server, as a gopher object.")
  6.  
  7. (defvar gopher-directory-mode-hook nil "\
  8. *Invoked when entering a new gopher directory.")
  9.  
  10. (defvar gopher-directory-mode-map (make-keymap) "\
  11. Keymap for gopher-directory-mode.")
  12.  
  13. (defvar gopher-document-mode-hook nil "\
  14. *Invoked when showing gopher document.")
  15.  
  16. (defvar gopher-document-mode-map (make-keymap) "\
  17. Keymap for gopher-document-mode.")
  18.  
  19. (defvar gopher-form-mode-hooks nil "\
  20. *Invoked with entering a gopher form (i.e., for CSO).")
  21.  
  22. (defvar gopher-form-mode-map (make-keymap) "\
  23. Keymap for gopher-form-mode.")
  24.  
  25. (defvar gopher-tmp-buf nil "\
  26. Buffer used to receive output from gopher.")
  27.  
  28. (defvar gopher-debug-read t "\
  29. *If non-nil, show the current status about reading the gopher server output.")
  30.  
  31. (defvar gopher-object-type-alist (quote ((48 "" gopher-document-object) (49 "/" gopher-directory-object) (50 " <CSO>" gopher-cso-object) (51 " <error>" gopher-unimplemented-object) (52 " <binhex>" gopher-binary-object) (53 " <DOS>" gopher-binary-object) (54 " <UU>" gopher-binary-object) (55 " <?>" gopher-index-object) (56 " <TEL>" gopher-telnet-object) (57 " <bin>" gopher-binary-object) (84 " <T>" gopher-unimplemented-object) (115 " <)" gopher-binary-object) (77 " <MIME>" gopher-unimplemented-object) (104 " <html>" gopher-unimplemented-object) (73 " <image>" gopher-unimplemented-object) (99 " <cal>" gopher-unimplemented-object) (103 " <GIF>" gopher-binary-object))) "\
  32. *Alist describing the types of gopher objects this client know about.
  33. The keys are the gopher type characters.
  34. The second element in each list is the string to tag onto the end
  35. of an object's description, to identify it to the user.
  36. The third element is the function to use to retrieve the object.
  37. It is called with two arguments: the gopher object to retrieve and
  38. the buffer which should be returned to when the user is done
  39. with this object.")
  40.  
  41. (defmacro gopher-object-type (object) "Return the gopher type of OBJECT." (byte-code "ÁÂE‡" [object aref 0] 3))
  42.  
  43. (defmacro gopher-object-descr (object) "Return the gopher description of OBJECT." (byte-code "ÁÂE‡" [object aref 1] 3))
  44.  
  45. (defmacro gopher-object-selector (object) "Return the gopher selector string for OBJECT." (byte-code "ÁÂE‡" [object aref 2] 3))
  46.  
  47. (defmacro gopher-object-host (object) "Return the gopher hostname for OBJECT." (byte-code "ÁÂE‡" [object aref 3] 3))
  48.  
  49. (defmacro gopher-object-port (object) "Return the gopher TCP port number for OBJECT." (byte-code "ÁÂE‡" [object aref 4] 3))
  50.  
  51. (defmacro gopher-set-object-type (object type) "Set the gopher type of OBJECT to TYPE." (byte-code "Âà   F‡" [object type aset 0] 4))
  52.  
  53. (defmacro gopher-set-object-descr (object descr) "Set the gopher description of OBJECT to DESCR." (byte-code "Âà   F‡" [object descr aset 1] 4))
  54.  
  55. (defmacro gopher-set-object-selector (object selector) "Set the gopher selector string for OBJECT to SELECTOR." (byte-code "Âà   F‡" [object selector aset 2] 4))
  56.  
  57. (defmacro gopher-set-object-host (object host) "Set the gopher hostname for OBJECT to HOST." (byte-code "Âà   F‡" [object host aset 3] 4))
  58.  
  59. (defmacro gopher-set-object-port (object port) "Set the gopher TCP port number for OBJECT to PORT." (byte-code "Âà   F‡" [object port aset 4] 4))
  60.  
  61. (defun gopher (&optional askserv) "\
  62. Start a gopher session.  With C-u, prompt for a gopher server." (interactive "P") (byte-code "Ĉ…H    ÅÆÇ    ÅH\"IˆÄÄÈ !?…BÆÉÊ    ËH!\"‰ˆÄÌ͏‰ˆÈ !?…>ЈÏÐ!ˆÑÒ!ˆ‚ˆ    Ë I*ˆÓ    Ä\"‡" [askserv gopher-root-node portstr port nil 3 read-string "Gopher server: " numberp "Port: " int-to-string 4 (byte-code "Á!@‡" [portstr read-from-string] 2) ((error (byte-code "À‡" [nil] 1))) ding message "Port must be numeric" sit-for 1 gopher-dispatch-object] 11))
  63.  
  64. (defun gopher-dispatch-object (obj lastbuf) "\
  65. Dispatch a gopher object depending on it's type." (byte-code "Ä    ÅH
  66. \"ƒÆÇ8     #‚È     \")‡" [typedesc obj gopher-object-type-alist lastbuf assq 0 funcall 2 gopher-unimplemented-obect] 5))
  67.  
  68. (defun gopher-unimplemented-object (obj lastbuf) (byte-code "ÀÁ!‡" [error "unimplemented object type"] 2))
  69.  
  70. (defun gopher-next-field nil "\
  71. Returns as a string all chars between point and the next tab or newline.
  72. Point is advanced to after the tab (or to the end-of-line)." (byte-code "`ÂÃÄ!ˆÅ`\"‰ˆgÆ=…Ç ˆ    *‡" [beg s nil skip-chars-forward "^    
  73. " buffer-substring 9 forward-char] 4))
  74.  
  75. (defun gopher-make-local-vars (&rest pairs) (byte-code "…Á@!ˆ@A@LˆAA‰ˆ‚‡" [pairs make-local-variable] 4))
  76.  
  77. (defun gopher-get-tmp-buf nil "\
  78. Get a temporary buffer in which to receive gopher output." (byte-code "Á!†ÂÃ!‰ˆÄ!ˆ‡" [gopher-tmp-buf bufferp get-buffer-create " *gopher-tmp*" buffer-flush-undo] 4))
  79.  
  80. (defun gopher-get-dir-buf (descr) "\
  81. Get a new buffer suitable for a gopher directory or document." (byte-code "ÁÂ!Ã!ˆ)‡" [buf generate-new-buffer "*gopher*" buffer-flush-undo] 3))
  82.  
  83. (fset (quote gopher-get-doc-buf) (symbol-function (quote gopher-get-dir-buf)))
  84.  
  85. (defun gopher-trim-blanks (str) "\
  86. Remove leading and trailing blanks from STR." (byte-code "ÁÂ\"ˆÃÄ!ÁÅÃÄ!#O‡" [str string-match "\\`[     
  87. ]*" match-end 0 "[     
  88. ]*\\'"] 9))
  89.  
  90. (defun gopher-directory-object (obj oldbuf) "\
  91. Retrieve and display a gopher directory." (byte-code "Æ Ç
  92. ÈH!É
  93. ÊH
  94. ËH
  95. ÌH$ˆÍ    !ˆÎÄÏ!Ð $ˆÑ     \"ˆebˆd`ZÒV…6ÓÒ!ˆÔ ˆÕ
  96. ÈHP‰*‡" [tmpbuf dirbuf obj oldbuf gopher-dir mode-line-buffer-identification gopher-get-tmp-buf gopher-get-dir-buf 1 gopher-retrieve-document 2 3 4 switch-to-buffer gopher-make-local-vars gopher-parse-directory gopher-last gopher-format-directory 7 forward-char gopher-directory-mode "Gopher: "] 12))
  97.  
  98. (defun gopher-parse-directory (buf) "\
  99. Parse the gopher directory in buffer BUF into our internal representation.
  100. Returns a vector of gopher objects." (byte-code "ŠqˆebˆÅed\"Æ    Ã\"Çm?…*
  101. È Iˆ T‰ˆÉÊ!ˆ‚ˆ
  102. +)‡" [buf len dir nil i count-lines make-vector 0 gopher-parse-directory-line forward-line 1] 7))
  103.  
  104. (defun gopher-parse-directory-line nil "\
  105. Parse the line containing point as a gopher directory entry.
  106. Returns the corresponding gopher object." (byte-code "ÅÆ ˆg‰ˆÇ ˆÈ ‰ˆÈ ‰ˆÈ ‰ˆÈ ‰ˆÉÊ \"…,Ë !‰ˆÌ    
  107. %)‡" [type descr selector host port nil beginning-of-line forward-char gopher-next-field string-match "^[0-9]+$" string-to-int vector] 14))
  108.  
  109. (defun gopher-format-directory (dir buf) "\
  110. Print the directory vector DIR into buffer BUF." (byte-code "ŠqˆÄ ˆÅ G    
  111. W…\"Æ     H    T\"ˆ    T‰ˆ‚ *)‡" [buf i len dir erase-buffer 0 gopher-format-directory-line] 5))
  112.  
  113. (defun gopher-format-directory-line (obj ndx) "\
  114. Insert a line describing the gopher object OBJ into the current buffer.
  115. NDX is a numeric index to display to the left of the object description." (byte-code "Å    !Æ ÇH \"GÈW…ÉÈGZÊ\"cˆcˆËcˆ ÌHcˆ
  116. ƒ0Ì
  117. 8‚7ÍÎ ÇH!PcˆÏc*‡" [ndx-str ndx typedesc obj gopher-object-type-alist int-to-string assq 0 5 make-string 32 ". " 1 " ???" char-to-string "
  118. "] 7))
  119.  
  120. (defun gopher-directory-mode nil "\
  121. Gopher directory mode.
  122.  
  123. \\{gopher-directory-mode-map}
  124. " (byte-code "Å!ˆÆ‰ˆÇ‰ˆÈÉ!ˆÄ‰‡" [gopher-directory-mode-map major-mode mode-name buffer-read-only t use-local-map gopher-directory-mode "gopher dir" run-hooks gopher-directory-mode-hook] 4))
  125.  
  126. (suppress-keymap gopher-directory-mode-map)
  127.  
  128. (define-key gopher-directory-mode-map "" (quote gopher-directory-choose))
  129.  
  130. (define-key gopher-directory-mode-map " " (quote gopher-directory-choose))
  131.  
  132. (define-key gopher-directory-mode-map "l" (quote gopher-last-node))
  133.  
  134. (define-key gopher-directory-mode-map "q" (quote gopher-last-node))
  135.  
  136. (define-key gopher-directory-mode-map "u" (quote gopher-last-node))
  137.  
  138. (define-key gopher-directory-mode-map "=" (quote gopher-directory-show-object))
  139.  
  140. (defun gopher-directory-current-obj nil "\
  141. Returns the object described by the line point is on
  142. (in a gopher directory buffer)." (byte-code "Áe`T\"SH‡" [gopher-dir count-lines] 4))
  143.  
  144. (defun gopher-directory-choose nil "\
  145. Choose an item from the directory, and do whatever is appropriate
  146. based on the object's type." (interactive) (byte-code "ÀˆÁ p\"‡" [nil gopher-dispatch-object gopher-directory-current-obj] 4))
  147.  
  148. (defun gopher-directory-show-object nil "\
  149. Dump the internal information in a gopher object." (interactive) (byte-code "ƈɠÊHË     \"
  150. ƒÌ
  151. 8‚Í
  152. ƒ$Î
  153. 8‚%ÍϐÐÑÒ     $!ˆÐÑÓÌH\"!ˆÐÑÔÎH\"!ˆÐÑÕÖH\"!ˆÐÑ×ØH\"!ˆp‘-ˆÙÚÏ!!ˆÛÆ!ˆÈ‰‡" [obj type typespec gopher-object-type-alist typetag typeproc nil buffer-read-only t gopher-directory-current-obj 0 assq 1 "?" 2 "*Gopher object*" princ format "Type        : %c   `%s'   %s
  154. " "Description : %s
  155. " "Selector    : %s
  156. " "Host        : %s
  157. " 3 "Port        : %d
  158. " 4 shrink-window-if-larger-than-buffer get-buffer-window set-buffer-modified-p] 17))
  159.  
  160. (defun gopher-last-node nil "\
  161. Return to the previous gopher node.
  162. By convention, a gopher buffer has the local variable gopher-last which
  163. contains the buffer to which we should return." (interactive) (byte-code "ˆpà   !ˆÄ!)‡" [oldbuf gopher-last nil switch-to-buffer kill-buffer] 3))
  164.  
  165. (defun gopher-document-object (obj oldbuf &optional end-regexp) "\
  166. Retrieve and display a gopher document.
  167. Optional argument END-REGEXP is used if the data will not be ended by `.'." (byte-code "Å    ÆH!Ç    ÈH    ÉH    ÊH
  168. %ˆË!ˆÌÍ \"ˆebˆÎ ˆÏ    ÆHP‰)‡" [docbuf obj end-regexp oldbuf mode-line-buffer-identification gopher-get-doc-buf 1 gopher-retrieve-document 2 3 4 switch-to-buffer gopher-make-local-vars gopher-last gopher-document-mode "Gopher: "] 8))
  169.  
  170. (suppress-keymap gopher-document-mode-map)
  171.  
  172. (define-key gopher-document-mode-map "l" (quote gopher-last-node))
  173.  
  174. (define-key gopher-document-mode-map "q" (quote gopher-last-node))
  175.  
  176. (define-key gopher-document-mode-map "u" (quote gopher-last-node))
  177.  
  178. (define-key gopher-document-mode-map " " (quote scroll-up))
  179.  
  180. (define-key gopher-document-mode-map "" (quote scroll-down))
  181.  
  182. (define-key gopher-document-mode-map "" (quote gopher-scroll-one-line-up))
  183.  
  184. (defun gopher-document-mode nil "\
  185. Gopher document mode.
  186.  
  187. \\{gopher-document-mode-map}
  188. " (byte-code "Å!ˆÆ‰ˆÇ‰ˆÈÉ!ˆÄ‰‡" [gopher-document-mode-map major-mode mode-name buffer-read-only t use-local-map gopher-document-mode "gopher doc" run-hooks gopher-document-mode-hook] 4))
  189.  
  190. (defun gopher-scroll-one-line-up (&optional arg) "\
  191. Scroll the selected window up (forward in the text) one line (or N lines)." (interactive "p") (byte-code "ÁˆÂ†Ã!‡" [arg nil scroll-up 1] 2))
  192.  
  193. (defun gopher-cso-object (obj oldbuf) "\
  194. Display a CSO lookup form." (byte-code "ÂÃHÄÅÆ$ˆÇÈ    É$‡" [obj oldbuf gopher-form 1 gopher-do-cso 4 ("====== phone directory lookup ======" "
  195.  Press `C-c RET' to lookup, `C-c l' to return to the last gopher object." "
  196.  (you must fill in at least one of the first three fields" "
  197. " "Name    : " 1 "
  198. " "Phone   : " 2 "
  199. " "E-Mail  : " 3 "
  200. " "Address : " 4) gopher-make-local-vars gopher-last gopher-obj] 6))
  201.  
  202. (defconst gopher-cso-fields (quote ("name" "phone" "email" "address")) "\
  203. Field names to use in CSO queries.")
  204.  
  205. (defun gopher-do-cso (vals) "\
  206. Make a CSO query.  VALS is the data the user entered in the form,
  207. as a list of strings." (byte-code "ÆÇÈ8GÉ8GÊ8G#!…ËÌ!ˆÍ …CÆ@G!?…5Π   Ï
  208. @Ð@%‰ˆA‰ˆ
  209. A‰ˆ‚ˆÊ    IˆÑpÒ#ˆÓ !+‡" [vals query fields gopher-cso-fields obj gopher-obj zerop + 0 1 2 error "Must specify name, phone, or email." "query" concat " " "=" gopher-document-object "^[2-9]" gopher-clean-cso-buffer] 11))
  210.  
  211. (defun gopher-clean-cso-buffer (obj) "\
  212. Strip CSO control information from the current buffer." (byte-code "ÇÂÂÂebˆÈcˆm?…‚gÉY…gÊXƒ,ËÌ!ˆÍHÈPc‚zgÎ=ƒjËÏ!ˆ`‰ˆÐÑ!ˆÒ `\"‰ˆ bˆÓ \"†SÔÕPcˆ ‰ˆ`‰ˆÐÑ!ˆÖ ˆ× `\"‚z`‰ˆØÙ!ˆ× `\"ˆØÚ!ˆØÙ!ˆ‚ˆebˆËÙ!,‡" [req buffer-read-only nil beg nreq obj t "" "
  213. " 51 57 delete-char 4 2 45 5 skip-chars-forward "^:" buffer-substring string= "--------------------------" "-----------------------------
  214. " forward-char delete-region forward-line 1 -1] 14))
  215.  
  216. (defun gopher-index-object (obj oldbuf) "\
  217. Query a gopher directory object." (byte-code "ÃÄ!Å
  218. !Æ!‰ˆGÇV…#    È
  219. ÈHÉQIˆÊ    p\"*‡" [str newobj obj read-from-minibuffer "Key: " copy-sequence gopher-trim-blanks 0 2 "    " gopher-directory-object] 8))
  220.  
  221. (defun gopher-telnet-object (obj oldbuf) "\
  222. Start a telnet session to a gopher object." (byte-code "    ÆH    ÇHÈ
  223. !?… É=ƒʂË
  224. Q‰ˆÌ!*ˆÍÎ \"ˆÏÐÑ\"ˆÈ    ÒHG!?…JÓÔÅ\"ˆÕ    ÆHÖP    ÒH×P\"‡" [arg obj port system-type oldbuf t 3 4 zerop vax-vms "/port=" " " telnet gopher-make-local-vars gopher-last local-set-key "l" gopher-last-node 2 sit-for 5 send-string "-telnet" "
  225. "] 10))
  226.  
  227. (defun gopher-binary-object (obj oldbuf) "\
  228. Retrieve a gopher object and save it to a file,
  229. without trying to interpret it in any way." (byte-code "ÃÄ!Å
  230. ÆH!Ç    
  231. ÈH
  232. ÉH
  233. ÊHË%ˆŠ    qˆÌ!)ˆÍ    !*‡" [fname buf obj read-file-name "File to save in: " gopher-get-doc-buf 1 gopher-retrieve-document 2 3 4 none write-file kill-buffer] 8))
  234.  
  235. (require (quote forms))
  236.  
  237. (defun gopher-form (form-name accept-action number-of-fields format-list) "\
  238. Display a buffer containing a form for the user to enter data.
  239. The form is described by NUMBER-OF-FIELDS and FORMAT-LIST (cf. forms-mode).
  240. FORM-NAME is a string to put in the modeline.
  241. When the user accepts the data in the form by pressing `C-c RET', the
  242. function ACCEPT-ACTION is called with a list of the strings which
  243. the user entered." (byte-code "ÇÈÉ!!ˆÊËÌ    ÍÎÏÂÐÂÑÂÒÂÓÂÔÂÕÂÖÂ×ÂØ &ˆÙ ˆÚ ˆÛ ˆÜ ˆÝÞ!ˆÝß!ˆÝà!ˆÝá!ˆÝâ!ˆã‰ˆä‰ˆåÂ!ˆæ!ˆçè    Sé\"!ˆêë!‡" [format-list number-of-fields nil accept-action major-mode mode-name gopher-form-mode-map switch-to-buffer generate-new-buffer "*gopher form*" gopher-make-local-vars forms-format-list forms-number-of-fields forms-field-sep "    " forms-read-only forms-multi-line forms--number-of-markers forms--markers forms--format forms--parser forms--dynamic-text forms-fields forms-the-record-list forms-accept-action forms--process-format-list forms--make-format forms--make-parser erase-buffer make-local-variable forms--file-buffer forms--total-records forms--current-record forms--the-record-list forms--search-rexexp gopher-form-mode "gopher form" set-buffer-modified-p use-local-map forms--show-record make-string 9 run-hooks gopher-form-mode-hooks] 29))
  244.  
  245. (defun gopher-form-accept nil (interactive) (byte-code "ÁˆÂà\"‡" [forms-accept-action nil funcall forms--parse-form] 4))
  246.  
  247. (define-key gopher-form-mode-map "" (quote gopher-form-accept))
  248.  
  249. (define-key gopher-form-mode-map "l" (quote gopher-last-node))
  250.  
  251. (defun gopher-retrieve-document (buf sel host port &optional end-regexp) "\
  252. Retrieve a gopher object into BUF.
  253. The object is identified by a SEL HOST PORT triple.
  254. Optional argument END-REGEXP is used for data which is not `.'-terminated.
  255. If END-REGEXP is non-nil and not a string, then it is assumed that
  256. the data is binary, and reading will continue until the sender disconnects." (byte-code "†ʉˆŠ    qˆË ˆÌÍp $Î
  257. Ï\"ˆÐ
  258. ÑP\"ˆÇ‰ˆ…‡;…7dbˆÒÓ!ˆ;…@Ô!ƒJȉ‚ƒÕ
  259. !Ö>?ƒa× ˆØÙ!ˆÈ‰‚ƒ    …iØÚ!ˆÛÜ!ƒwÝ
  260. Þ\"‚zÝ
  261. !ˆ    …ƒØß!ˆ‚'ˆÈàᏈ;…”â ))‡" [end-regexp buf gopher-server-process host port sel wait t nil gopher-debug-read "^\\.$" erase-buffer open-network-stream "gopher" set-process-sentinel gopher-sentinel process-send-string "
  262. " forward-line -1 looking-at process-status (open run) ding message "gopher: connection closed" "gopher: Reading..." boundp epoch::version accept-process-output 2 " " (byte-code "Á!‡" [gopher-server-process delete-process] 2) ((error (byte-code "À‡" [t] 1))) gopher-clean-text] 17))
  263.  
  264. (defun gopher-clean-text nil "\
  265. Decode text transmitted by gopher.
  266. 0. Delete status line.
  267. 1. Delete `^M' at end of line.
  268. 2. Delete `.' at end of buffer (end of text mark).
  269. 3. Delete `.' at beginning of line.   (does gopher want this?)" (byte-code "dbˆn?…
  270. ÂcˆebˆÃÄÅ\"ˆdbˆÆÇ!ˆÈÉ!…0Ê`ÆË!ˆ`\"ˆÆÇ!ˆ‚ˆebˆÌÍÀÁ#…CÎÇ!ˆ‚4‡" [nil t "
  271. " replace-regexp "[^
  272. ]*$" "" forward-line -1 looking-at "^\\.$" delete-region 1 search-forward "
  273. .." delete-char] 10))
  274.  
  275. (defun gopher-sentinel (proc status) (byte-code "À‡" [nil] 1))
  276.