;;; 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 11! !,6,qp!(6ed\")-6>);=! @ A!ÁB!CB.Wl.D.!EF!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!;!XcVk#TV<!!!!\"!\"\n\nC#*$+\"\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 ";\nDC!! FSEDD T" 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!?KKMM" [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\" \\), GUx G#GWxGZ\"\"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! Nqc!! 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 \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,\nH% X% SX% 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 PO\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" "" fboundp get-buffer-create "*forms-mode debug*"] 3))