;;; compiled by jraja@lk-hp-11 on Fri Nov 12 08:40:32 1993
;;; from file /u/opi/86/jraja/ohtatcp/amitcp/src/appl/EmacsTcp/src/forms.el
;;; emacs version 18.58.6.
;;; bytecomp version 2.07; 15-jul-92.
;;; optimization is on; compiled with emacs18 compatibility.

(byte-code "!!" [provide forms forms-mode] 2)
(defconst forms-version "1.2.9" "\
Version of forms-mode implementation")
(defvar forms-forms-scrolls t "\
If non-null: redefine scroll-up/down to be used with forms-mode.")
(defvar forms-forms-jumps t "\
If non-null: redefine beginning/end-of-buffer to be used with forms-mode.")
(defvar forms-mode-hooks nil "\
Hook functions to be run upon entering forms mode.")
(defvar forms-file nil "\
Name of the file holding the data.")
(defvar forms-format-list nil "\
List of formatting specifications.")
(defvar forms-number-of-fields nil "\
Number of fields per record.")
(defvar forms-field-sep "	" "\
Field separator character (default TAB)")
(defvar forms-read-only nil "\
Read-only mode (defaults to the write access on the data file).")
(defvar forms-multi-line "" "\
Character to separate multi-line fields (default ^K)")
(defvar forms-forms-scroll t "\
Redefine scroll-up/down to perform forms-next/prev-record when in
 forms mode.")
(defvar forms-forms-jump t "\
Redefine beginning/end-of-buffer to perform forms-first/last-record
 when in forms mode.")
(defvar forms--file-buffer nil "\
Buffer which holds the file data")
(defvar forms--total-records 0 "\
Total number of records in the data file.")
(defvar forms--current-record 0 "\
Number of the record currently on the screen.")
(defvar forms-mode-map nil "\
Keymap for form buffer.")
(defvar forms--markers nil "\
Field markers in the screen.")
(defvar forms--number-of-markers 0 "\
Number of fields on screen.")
(defvar forms--the-record-list nil "\
List of strings of the current record, as parsed from the file.")
(defvar forms--search-regexp nil "\
Last regexp used by forms-search.")
(defvar forms--format nil "\
Formatting routine.")
(defvar forms--parser nil "\
Forms parser routine.")
(defvar forms--mode-setup nil "\
Internal - keeps track of forms-mode being set-up.")
(make-variable-buffer-local (quote forms--mode-setup))
(defvar forms--new-record-filter nil "\
Internal - set if a new record filter has been defined.")
(defvar forms--modified-record-filter nil "\
Internal - set if a modified record filter has been defined.")
(defvar forms--dynamic-text nil "\
Internal - holds dynamic text to insert between fields.")
(defvar forms-fields nil "\
List with fields of the current forms. First field has number 1.")
(defun forms-mode (&optional primary) "\
Major mode to visit files in a field-structured manner using a form.

 Commands (prefix with C-c if not in read-only mode):
 \\{forms-mode-map}" (interactive) (byte-code " 	  !!!!!!!!! : !B !VX !X ;X !	 	;{ 	G={ 	\" ! !!! ! ! !! K ! !  !!! K ! $! $#!!!()! !!!!!1 11! !,6,qp!(6ed\")-6>);=! @  A !ÁB !C B.Wl.D .!E F !G  " [primary forms--mode-setup kill-all-local-variables make-local-variable forms-file forms-number-of-fields forms-format-list forms-field-sep forms-read-only forms-multi-line forms-forms-scroll forms-forms-jump fmakunbound forms-new-record-filter eval-current-buffer error "'forms-file' has not been set" "'forms-number-of-fields' has not been set" 0 "'forms-number-of-fields' must be > 0" "'forms-field-sep' is not a string" 1 string= "'forms-multi-line' is equal to 'forms-field-sep'" "'forms-multi-line' must be nil or a one-character string" forms--number-of-markers forms--markers forms--process-format-list forms--format forms--make-format forms--parser forms--make-parser forms--new-record-filter fboundp boundp forms--modified-record-filter forms-modified-record-filter forms--dynamic-text forms-fields nil buffer-read-only buffer-file-name auto-save-mode erase-buffer forms--file-buffer forms--total-records forms--current-record forms--the-record-list forms--search-rexexp forms-mode-map make-keymap forms--mode-commands forms--change-commands find-file-noselect ro bury-buffer count-lines t forms-mode major-mode "Forms" mode-name minor-mode-alist forms--set-minor-mode forms--set-keymaps set-buffer-modified-p revert-buffer-function forms-revert-buffer forms-jump-record run-hooks forms-mode-hooks forms--help] 3))
(defun forms--process-format-list nil "\
Validate forms-format-list and set some global variables." (byte-code "\"\n !\n< !\nƉ	\n\n \n!\n!9G !G !; ! Xc Vk #TV  < !! !!\" !\"\n\nC#*$ +\"\n!#\"" [forms--debug "forms-forms-list before 1st pass:\n" forms-format-list error "'forms-format-list' has not been set" "'forms-format-list' is not a list" 0 forms--number-of-markers field-num this-item the-list nil car-safe cdr-safe rem el boundp eval numberp forms-number-of-fields "Forms error: field number %d out of range 1..%d" fboundp "Forms error: not a function: %s" prin1-to-string "Invalid element in 'forms-format-list': %s" append "forms-forms-list after 1st pass:\n" forms--concat-adjacent "forms-forms-list after 2nd pass:\n" make-vector forms--markers] 6))
(defun forms--make-format nil "\
Generate format function for forms" (byte-code "	!!" [forms--format-maker forms-format-list forms--format forms--debug] 2))
(defun forms--format-maker (the-format-list) "\
Returns the parser function for forms" (byte-code "\"\"\")" [0 the-marker append (lambda (arg) (setq forms--dynamic-text nil)) apply mapcar forms--make-format-elt the-format-list] 7))
(fset (quote forms--make-format-elt) (quote (lambda (el) (byte-code ";\n DC!! FSEDDT</ DCFC" [el insert numberp aset forms--markers the-marker (point-marker) elt arg let the-dyntext (insert the-dyntext) (setq forms--dynamic-text (append forms--dynamic-text (list the-dyntext)))] 5))))
(defun forms--concat-adjacent (the-list) "\
Concatenate adjacent strings in the-list and return the resulting list" (byte-code ":' A!@;! \n@;! @\n@P\nAB% @\nB)" [the-list forms--concat-adjacent the-rest] 2))
(defun forms--make-parser nil "\
Generate parser function for forms" (byte-code "	!!" [forms--parser-maker forms-format-list forms--parser forms--debug] 2))
(defun forms--parser-maker (the-format-list) "\
Returns the parser function for forms" (byte-code "C\"	\"\"\"E+" [nil the--format-list seen-text the-field append the-format-list lambda (let (here) (goto-char (point-min))) apply mapcar forms--make-parser-elt] 9))
(byte-code "MM" [forms--make-parser-elt (lambda (el) (byte-code ";A 	) C#DEE	SGEEFE; !DDEEGDD!U 	Q 	#ևe 	 	SFC< 	~ 	SF%C " [el the-field (setq here (point)) if not append (search-forward) (nil t nil) error "Parse error: cannot find \"%s\"" aset the-recordv buffer-substring here - (point) looking-at regexp-quote "Parse error: not looking at \"%s\"" forward-char t seen-text nil numberp "Cannot parse adjacent fields %d and %d" (buffer-substring (point) (point-max)) list let ((here (point)) (the-dyntext (car-safe forms--dynamic-text))) (if (not (search-forward the-dyntext nil t nil)) (error "Parse error: cannot find \"%s\"" the-dyntext)) (buffer-substring here (- (point) (length the-dyntext))) (setq forms--dynamic-text (cdr-safe forms--dynamic-text)) ((let ((the-dyntext (car-safe forms--dynamic-text))) (if (not (looking-at (regexp-quote the-dyntext))) (error "Parse error: not looking at \"%s\"" the-dyntext)) (forward-char (length the-dyntext)) (setq forms--dynamic-text (cdr-safe forms--dynamic-text))))] 10)) forms--set-minor-mode (lambda nil (byte-code " " [forms-read-only " View" minor-mode-alist] 2))] 2)
(defun forms--set-keymaps nil "\
Set the keymaps used in this mode." (byte-code " \n! ! \n# #" [forms-read-only use-local-map forms-mode-map make-sparse-keymap define-key current-local-map "" "	" forms-next-field] 4))
(defun forms--mode-commands (map) "\
Fill map with all commands." (byte-code "	#	#	#	#	#	#	#	#	#	#	#	#	#	#	#	#	#	##	#	'#" [define-key map "	" forms-next-field " " forms-next-record "d" forms-delete-record "e" forms-edit-mode "i" forms-insert-record "j" forms-jump-record "n" "p" forms-prev-record "q" forms-exit "s" forms-search "v" forms-view-mode "x" forms-exit-no-save "<" forms-first-record ">" forms-last-record "?" describe-mode "" "" ESC-prefix "" ctl-x-map "" universal-argument "" help-map] 4))
(defun forms--change-commands nil "\
Localize some commands." (byte-code "! KMM! KMM!- KMM!< KMM!?K KMM" [fboundp forms--scroll-down scroll-down (lambda (&optional arg) (interactive "P") (byte-code " 	 !!" [forms--mode-setup forms-forms-scroll forms-prev-record arg forms--scroll-down] 2)) forms--scroll-up scroll-up (lambda (&optional arg) (interactive "P") (byte-code " 	 !!" [forms--mode-setup forms-forms-scroll forms-next-record arg forms--scroll-up] 2)) forms--beginning-of-buffer beginning-of-buffer (lambda nil (interactive) (byte-code " 	   " [forms--mode-setup forms-forms-jump forms-first-record forms--beginning-of-buffer] 1)) forms--end-of-buffer end-of-buffer (lambda nil (interactive) (byte-code " 	   " [forms--mode-setup forms-forms-jump forms-last-record forms--end-of-buffer] 1)) forms--save-buffer save-buffer (lambda (&optional arg) (interactive "p") (byte-code "  \nq!)!" [forms--mode-setup forms--checkmod forms--file-buffer forms--save-buffer arg] 2))] 2))
(defun forms--help nil "\
Initial help." (byte-code " !!" [forms-read-only message "SPC:next   DEL:prev   <:first   >:last   ?:help   q:exit" "C-c n:next   C-c p:prev   C-c <:first   C-c >:last   C-c ?:help   C-c q:exit"] 2))
(defun forms--trans (subj arg rep) "\
Translate in SUBJ all chars ARG into char REP. ARG and REP should
 be single-char strings." (byte-code "	G!!			#	- 		I	T	 ," [0 subj regexp-quote arg string-to-char rep k re x i string-match] 5))
(fset (quote forms--exit) (quote (lambda (query &optional save) (byte-code "	!  	! 	q )	q p!)\n!8 >  !>  p!)" [buffer-name forms--file-buffer buf forms--checkmod save buffer-modified-p save-buffer delete-auto-save-file-if-necessary kill-buffer get-buffer beep message "Problem saving buffers?"] 2))))
(defun forms--get-record nil "\
Fetch the current record from the file buffer." (byte-code "n !` \n`\"\nb)" [forward-line 0 here end-of-line buffer-substring] 3))
(defun forms--show-record (the-record) "\
Format THE-RECORD according to forms-format-list,
 and display it in the current buffer." (byte-code "\nG 	#	\nP	\n	#@ 	OC\"\\) , GUx  G#GWx GZ\"\"C#!eb!R" [nil 0 forms-field-sep field-sep-length found-pos start-pos the-result forms-multi-line forms--trans the-record "\n" string-match ent append forms--the-record-list buffer-read-only erase-buffer forms-number-of-fields beep message "Record has %d fields instead of %d." make-list "" forms-fields forms--format set-buffer-modified-p forms-read-only " " forms--current-record "/" forms--total-records mode-line-process] 5))
(defun forms--parse-form nil "\
Parse contents of form into list of strings." (byte-code "! )( 	\"!\"A), 	\")" [nil the-recordv vconcat forms--the-record-list forms--dynamic-text forms--parser forms--modified-record-filter [nil] the-fields append] 3))
(defun forms--update nil "\
Update current record with contents of form. As a side effect: sets
forms--the-record-list ." (byte-code " !  \n#% #\"5 ! N qc!!c!))" [forms-read-only message "Read-only buffer!" beep nil the-record forms--parse-form forms--the-record-list mapconcat identity forms-field-sep forms-multi-line forms--trans "\n" string-match "Multi-line fields in this record - update refused!" forms--file-buffer "*" forward-line 0 kill-line] 4))
(defun forms--checkmod nil "\
Check if this form has been modified, and call forms--update if so." (byte-code "! ` !\nb)" [buffer-modified-p nil here forms--update set-buffer-modified-p] 2))
(defun forms-find-file (fn) "\
Visit file FN in forms mode" (interactive "fForms file: ") (byte-code "	!\n !" [find-file-read-only fn forms--mode-setup forms-mode t] 2))
(defun forms-find-file-other-window (fn) "\
Visit file FN in form mode in other window" (interactive "fFbrowse file in other window: ") (byte-code "	!  !" [find-file-other-window fn eval-current-buffer forms--mode-setup forms-mode t] 2))
(defun forms-exit (query) "\
Normal exit. Modified buffers are saved." (interactive "P") (byte-code "	\"" [forms--exit query t] 3))
(defun forms-exit-no-save (query) "\
Exit without saving buffers." (interactive "P") (byte-code "	\"" [forms--exit query nil] 3))
(defun forms-next-record (arg) "\
Advance to the ARGth following record." (interactive "P") (byte-code "	!\\\"" [forms-jump-record forms--current-record prefix-numeric-value arg t] 4))
(defun forms-prev-record (arg) "\
Advance to the ARGth previous record." (interactive "P") (byte-code "	!Z\"" [forms-jump-record forms--current-record prefix-numeric-value arg t] 4))
(defun forms-jump-record (arg &optional relative) "\
Jump to a random record." (interactive "NRecord number: ") (byte-code "	V X  ?v 	# Z	\nˊq!O \nU[ 	\n\n![\\\\	[ 	\n![\\\\	 )!	U?u 	 	\"*" [arg forms--total-records 0 beep relative message "Record number %d out of range 1..%d" forms--checkmod forms--current-record cur disp forms--show-record forms--file-buffer forward-line goto-line forms--get-record "Stuck at record %d."] 5))
(defun forms-first-record nil "\
Jump to first record." (interactive) (byte-code "!" [forms-jump-record 1] 2))
(defun forms-last-record nil "\
Jump to last record. As a side effect: re-calculates the number
 of records in the data file." (interactive) (byte-code "qed\")U  \n\")!" [forms--file-buffer count-lines numrec forms--total-records beep message "Number of records reset to %d." forms-jump-record] 4))
(defun forms-view-mode nil "\
Visit buffer read-only." (interactive) (byte-code "?   " [forms-read-only forms--checkmod t forms-mode] 1))
(defun forms-edit-mode nil "\
Make form suitable for editing, if possible." (interactive) (byte-code "\nq) \"  	\"?%  )" [forms-read-only ro forms--file-buffer buffer-read-only t message "No write access to \"%s\"" forms-file beep nil equal forms-mode] 3))
(defun forms-insert-record (arg) "\
Create a new record before the current one. With ARG: store the
 record after the current one.
 If a function forms-new-record-filter is defined, or forms-new-record-filter
 contains the name of a function, it is called to
 fill (some of) the fields with default values." (interactive "P") (byte-code "	 	T\n 	 1 	T\"!\"A)7 	\"#q!!c!)+T	!" [arg forms--current-record nil the-record the-list ln forms--checkmod forms--new-record-filter make-vector forms-number-of-fields "" the-fields append make-list mapconcat identity forms-field-sep forms--file-buffer goto-line open-line 1 forward-line 0 forms--total-records forms-jump-record] 4))
(defun forms-delete-record (arg) "\
Deletes a record. With ARG: don't ask." (interactive "P") (byte-code " 	 !1 q!!)\nS\n\nV, \n!)!" [forms--checkmod arg y-or-n-p "Really delete this record? " forms--current-record ln forms--file-buffer goto-line kill-line 1 forms--total-records forms-jump-record message ""] 2))
(defun forms-search (regexp) "\
Search REGEXP in file buffer." (interactive (byte-code "\n\n \nQQ!C" [read-string "Search for" forms--search-regexp " (" ")" ": "] 5)) (byte-code "	\"	  ŉ	\nq` 	#; b	Q!łG  	e`\"T\n)Z \n	!	#,	" [equal regexp "" forms--search-regexp forms--checkmod nil forms-field-sep fld-sep here the-record the-line forms--file-buffer end-of-line re-search-forward t message "\"" "\" not found." forms--get-record count-lines forms--current-record forms--show-record] 4))
(defun forms-revert-buffer (&optional arg noconfirm) "\
Reverts current form to un-modified." (interactive "P") (byte-code "\n ! !!" [noconfirm yes-or-no-p "Revert form to unmodified? " set-buffer-modified-p nil forms-jump-record forms--current-record] 2))
(defun forms-next-field (arg) "\
Jump to ARG-th next field." (interactive "p") (byte-code "`U  \n\\ɍ?% \nHb," [0 nil cnt there here i arg 1 done (byte-code "	W, \nH% X% SX% b\"T " [i forms--number-of-markers forms--markers there here cnt 0 throw done t] 4) forms--markers] 4))
(defun forms-enumerate (the-fields) "\
Take a quoted list of symbols, and set their values to the numbers
1, 2 and so on. Returns the higest number.

Usage: (setq forms-number-of-fields
             (forms-enumerate
              '(field1 field2 field2 ...)))" (byte-code "\n 	T\n!\n!	L) 	)" [0 the-index the-fields car-safe el cdr-safe] 2))
(defvar forms--debug nil "\
*Enables forms-mode debugging if not nil.")
(defun forms--debug (&rest args) "\
Internal - debugging routine" (byte-code "_ S !!; \nPO \n!Q!< !\n!Q)A \nQ!O \nK!Q) !qdb\nc*" [forms--debug nil ret args car-safe el cdr-safe prin1-to-string " = " boundp eval vel "\n" "<unbound>" fboundp get-buffer-create "*forms-mode debug*"] 3))
