Fix whitespace, add execution cmd message

- fixup whitespace globally
- dump executed command in notification area
This commit is contained in:
Christian Barthel 2021-02-19 21:18:08 +01:00
parent 78a196b94d
commit 71b6abbf9d
1 changed files with 69 additions and 68 deletions

View File

@ -129,22 +129,22 @@
(menu-map (make-sparse-keymap "TLA+")) (menu-map (make-sparse-keymap "TLA+"))
(operator-map (make-sparse-keymap)) (operator-map (make-sparse-keymap))
(action-operator-map (make-sparse-keymap)) (action-operator-map (make-sparse-keymap))
(temporal-operator-map (make-sparse-keymap)) (temporal-operator-map (make-sparse-keymap))
(export-map (make-sparse-keymap)) (export-map (make-sparse-keymap))
(modul-operators (make-sparse-keymap)) (modul-operators (make-sparse-keymap))
(modul-sequences-operators (make-sparse-keymap)) (modul-sequences-operators (make-sparse-keymap))
(modul-naturals-operators (make-sparse-keymap)) (modul-naturals-operators (make-sparse-keymap))
) )
(set-keymap-parent map lisp-mode-shared-map) (set-keymap-parent map lisp-mode-shared-map)
(define-key map "\e\t" 'ispell-complete-word) (define-key map "\e\t" 'ispell-complete-word)
(define-key map (kbd "C-c C-t e") 'tla+-run-tlatex-dvi) (define-key map (kbd "C-c C-t e") 'tla+-run-tlatex-dvi)
(define-key map (kbd "C-c C-t o") 'tla+-open-dvi) (define-key map (kbd "C-c C-t o") 'tla+-open-dvi)
(define-key map (kbd "C-c C-t c") 'tla+-run-sany) (define-key map (kbd "C-c C-t c") 'tla+-run-sany)
(define-key map (kbd "C-c C-t p") 'tla+-run-pluscal) (define-key map (kbd "C-c C-t p") 'tla+-run-pluscal)
(define-key map (kbd "C-c C-t m") 'tla+-run-model) (define-key map (kbd "C-c C-t m") 'tla+-run-model)
;; Main TLA+ Menu: ;; Main TLA+ Menu:
(bindings--define-key map [menu-bar tla+] (bindings--define-key map [menu-bar tla+]
@ -152,7 +152,7 @@
;; Modul Operators ;; Modul Operators
(bindings--define-key menu-map [modul-operators] (bindings--define-key menu-map [modul-operators]
(cons "Insert Modul Operator.." modul-operators)) (cons "Insert Modul Operator.." modul-operators))
;; Naturals Operators ;; Naturals Operators
(bindings--define-key modul-operators (bindings--define-key modul-operators
@ -172,7 +172,7 @@
(lambda () (interactive) (lambda () (interactive)
(insert "-") (insert "-")
(backward-char 2)) (backward-char 2))
:help "Subtraction")) :help "Subtraction"))
(bindings--define-key (bindings--define-key
modul-naturals-operators [mult-nat] modul-naturals-operators [mult-nat]
@ -186,7 +186,7 @@
'(menu-item "/" '(menu-item "/"
(lambda () (interactive) (lambda () (interactive)
(insert "/")) (insert "/"))
:help "Division")) :help "Division"))
(bindings--define-key (bindings--define-key
modul-naturals-operators [exp-nat] modul-naturals-operators [exp-nat]
@ -217,7 +217,7 @@
(insert "%")) (insert "%"))
:help "Modulo")) :help "Modulo"))
(bindings--define-key (bindings--define-key
modul-naturals-operators [leq-nat] modul-naturals-operators [leq-nat]
'(menu-item "\\leq" '(menu-item "\\leq"
@ -231,7 +231,7 @@
(lambda () (interactive) (lambda () (interactive)
(insert "\\geq")) (insert "\\geq"))
:help "Greater Equal")) :help "Greater Equal"))
(bindings--define-key (bindings--define-key
modul-naturals-operators [lt-nat] modul-naturals-operators [lt-nat]
'(menu-item "<" '(menu-item "<"
@ -246,7 +246,7 @@
(insert ">")) (insert ">"))
:help "Greater than")) :help "Greater than"))
;; Sequence Operators ;; Sequence Operators
(bindings--define-key modul-operators (bindings--define-key modul-operators
[modul-sequences-operator] [modul-sequences-operator]
@ -260,7 +260,7 @@
(backward-char 2)) (backward-char 2))
:help :help
"Set of all Sequences of Elements of Set `S'")) "Set of all Sequences of Elements of Set `S'"))
(bindings--define-key (bindings--define-key
modul-sequences-operators [head-s] modul-sequences-operators [head-s]
'(menu-item "Head(s)" '(menu-item "Head(s)"
@ -301,7 +301,7 @@
(backward-char 2)) (backward-char 2))
:help "length of sequence s")) :help "length of sequence s"))
;; Operators ;; Operators
(bindings--define-key menu-map [operator] (bindings--define-key menu-map [operator]
(cons "Insert Operator.." operator-map)) (cons "Insert Operator.." operator-map))
@ -314,7 +314,7 @@
action-operator-map [primed-operator] action-operator-map [primed-operator]
'(menu-item "e'" tla+-operator-primed '(menu-item "e'" tla+-operator-primed
:help "Value of e in final state of a step")) :help "Value of e in final state of a step"))
(bindings--define-key (bindings--define-key
action-operator-map [stutter-operator] action-operator-map [stutter-operator]
'(menu-item "[A]_e" tla+-operator-stutter '(menu-item "[A]_e" tla+-operator-stutter
@ -338,8 +338,8 @@
(bindings--define-key (bindings--define-key
action-operator-map [composition-operator] action-operator-map [composition-operator]
'(menu-item "A \\cdot B" tla+-operator-composition '(menu-item "A \\cdot B" tla+-operator-composition
:help "Composition of actions")) :help "Composition of actions"))
;; Temporal operators: ;; Temporal operators:
(bindings--define-key operator-map [temporal-operator] (bindings--define-key operator-map [temporal-operator]
(cons "Temporal Operator" temporal-operator-map)) (cons "Temporal Operator" temporal-operator-map))
@ -368,11 +368,11 @@
temporal-operator-map [leadsto-temporal-operator] temporal-operator-map [leadsto-temporal-operator]
'(menu-item "F ~> G" tla+-operator-leadsto '(menu-item "F ~> G" tla+-operator-leadsto
:help "F leads to G")) :help "F leads to G"))
;; Export Menu: ;; Export Menu:
(bindings--define-key menu-map [export] (bindings--define-key menu-map [export]
(cons "Export.." export-map)) (cons "Export.." export-map))
(bindings--define-key export-map [export-pdf] (bindings--define-key export-map [export-pdf]
'(menu-item "Run TLatex and create PDF" tla+-run-tlatex-pdf '(menu-item "Run TLatex and create PDF" tla+-run-tlatex-pdf
:help "Typeset TLaTex and create PDF Document")) :help "Typeset TLaTex and create PDF Document"))
@ -384,7 +384,7 @@
(bindings--define-key export-map [export-ps] (bindings--define-key export-map [export-ps]
'(menu-item "Run TLatex and create PS" tla+-run-tlatex-ps '(menu-item "Run TLatex and create PS" tla+-run-tlatex-ps
:help "Typeset TLaTex and create PS Document")) :help "Typeset TLaTex and create PS Document"))
(bindings--define-key export-map [export-open] (bindings--define-key export-map [export-open]
'(menu-item "Open DVI Viewer" tla+-open-dvi '(menu-item "Open DVI Viewer" tla+-open-dvi
:help "Open DVI Viewer")) :help "Open DVI Viewer"))
@ -404,13 +404,13 @@
"Create a TLC Model" "Create a TLC Model"
"(Open the TLC Configuration dialogue)")) "(Open the TLC Configuration dialogue)"))
(bindings--define-key map [menu-bar tla+ tla+-run-pluscal] (bindings--define-key map [menu-bar tla+ tla+-run-pluscal]
'(menu-item "Run PlusCal Translator" tla+-run-pluscal '(menu-item "Run PlusCal Translator" tla+-run-pluscal
:help :help
"Run pcal.trans" "Run pcal.trans"
"(Translator (PlusCal algorithm language -> TLA+)")) "(Translator (PlusCal algorithm language -> TLA+)"))
(bindings--define-key map [menu-bar tla+ tla+-run-sany] (bindings--define-key map [menu-bar tla+ tla+-run-sany]
'(menu-item "Run Syntax Checker" tla+-run-sany '(menu-item "Run Syntax Checker" tla+-run-sany
:help :help
@ -420,7 +420,7 @@
(bindings--define-key map [menu-bar tla+ tla+-update-note] (bindings--define-key map [menu-bar tla+ tla+-update-note]
'(menu-item "Add Update Comment" tla+-add-update-note '(menu-item "Add Update Comment" tla+-add-update-note
:help "Add Update Note")) :help "Add Update Note"))
(bindings--define-key map [menu-bar tla+ tla+-create-module] (bindings--define-key map [menu-bar tla+ tla+-create-module]
'(menu-item "Create new Module" tla+-create-module '(menu-item "Create new Module" tla+-create-module
:help "Create a new TLA+ Module")) :help "Create a new TLA+ Module"))
@ -432,10 +432,10 @@
(defconst tla+-font-lock-keywords (defconst tla+-font-lock-keywords
(list (list
'("\\\\\\*.*$" . font-lock-comment-face) '("\\\\\\*.*$" . font-lock-comment-face)
'("(\\*.*\\*)" . font-lock-comment-face) '("(\\*.*\\*)" . font-lock-comment-face)
'("\\<\\(MODULE\\|CONSTANTS?\\|UNCHANGED\\|VARIABLES?\\|THEOREM\\|LOCAL\\|ASSUME\\|LET\\|EXTENDS?\\)\\>" '("\\<\\(MODULE\\|CONSTANTS?\\|UNCHANGED\\|VARIABLES?\\|THEOREM\\|LOCAL\\|ASSUME\\|LET\\|EXTENDS?\\)\\>"
. font-lock-builtin-face) . font-lock-builtin-face)
'("\\<\\(TRUE\\|FALSE\\|OTHER\\|BOOLEAN\\|DOMAIN\\)\\>" . font-lock-type-face) '("\\<\\(TRUE\\|FALSE\\|OTHER\\|BOOLEAN\\|DOMAIN\\)\\>" . font-lock-type-face)
'("\\<\\(CONSTANT\\|SUBSET\\|ENABLED\\|UNCHANGED\\|INSTANCE\\|WITH\\|EXCEPT\\|UNION\\|IN\\|DOMAIN\\|EXCEPT\\|IF\\|THEN\\|ELSE\\|CHOOSE\\)\\>" . font-lock-keyword-face) '("\\<\\(CONSTANT\\|SUBSET\\|ENABLED\\|UNCHANGED\\|INSTANCE\\|WITH\\|EXCEPT\\|UNION\\|IN\\|DOMAIN\\|EXCEPT\\|IF\\|THEN\\|ELSE\\|CHOOSE\\)\\>" . font-lock-keyword-face)
'("\\('\\w*'\\)" . font-lock-variable-name-face) '("\\('\\w*'\\)" . font-lock-variable-name-face)
@ -445,14 +445,14 @@
;;;###autoload (add-to-list 'auto-mode-alist '("\\.tla\\'" . tla+-mode)) ;;;###autoload (add-to-list 'auto-mode-alist '("\\.tla\\'" . tla+-mode))
;;;###autoload ;;;###autoload
(define-derived-mode tla+-mode fundamental-mode "TLA+" (define-derived-mode tla+-mode fundamental-mode "TLA+"
"Major mode for editing TLA+ specification files. "Major mode for editing TLA+ specification files.
This package defines TLA+ Major Mode to manipulate TLA+ This package defines TLA+ Major Mode to manipulate TLA+
specifications as invented by Leslie Lamport [1]. specifications as invented by Leslie Lamport [1].
In this mode, syntax highlighting is activated for TLA+ In this mode, syntax highlighting is activated for TLA+
specification files. Various operators can be inserted specification files. Various operators can be inserted
by `tla+-operator-NAME'. by `tla+-operator-NAME'.
Features: Features:
- Syntax Highlighting for TLA+ Specification Files - Syntax Highlighting for TLA+ Specification Files
@ -465,7 +465,7 @@ Features:
or typical Emacs keystrokes. or typical Emacs keystrokes.
- Use templates to generate Modules - Use templates to generate Modules
- An Emacs widget to create TLC configuration files - An Emacs widget to create TLC configuration files
- Options to run the TLC model checker on TLA+ - Options to run the TLC model checker on TLA+
specifications (`C-c C-t m'). specifications (`C-c C-t m').
- Translate PlusCal code to TLA+ specification - Translate PlusCal code to TLA+ specification
with `C-c C-t p'. with `C-c C-t p'.
@ -485,7 +485,7 @@ Configuration:
(setq tla+-tlatools-path </path/to/tla2tools.jar>) (setq tla+-tlatools-path </path/to/tla2tools.jar>)
or with: or with:
M-x customize-group <RET> tla+ M-x customize-group <RET> tla+
You may also set the following paths: You may also set the following paths:
tla+-java-path tla+-java-path
tla+-dvipdf-path tla+-dvipdf-path
@ -545,12 +545,12 @@ specification file."
(insert (concat "\\* " text)) (insert (concat "\\* " text))
(goto-char (- (point-max) (length text))))) (goto-char (- (point-max) (length text)))))
(defun tla+-run-sany () (defun tla+-run-sany ()
"This function runs tla2sany.SANY (TLA syntax checker) "This function runs tla2sany.SANY (TLA syntax checker)
The function executes the TLA+ Syntax checker and reports errors The function executes the TLA+ Syntax checker and reports errors
in a new frame. Errors are clickable buttons and the user can in a new frame. Errors are clickable buttons and the user can
directly go to the error line. directly go to the error line.
It is meant to be run from a TLA+ Specification buffer. It is meant to be run from a TLA+ Specification buffer.
@ -594,9 +594,9 @@ Operation:
"Run the tlc2.TLC Model checker "Run the tlc2.TLC Model checker
Run the tlc2.TLC model checker on a TLA+ buffer with a given Run the tlc2.TLC model checker on a TLA+ buffer with a given
moden CFGFILE. The function constructs an absolute path to moden CFGFILE. The function constructs an absolute path to
a model file spec.cfg and uses the current buffer as TLA+ a model file spec.cfg and uses the current buffer as TLA+
specification. It then executes the tlc2.TLC model checker specification. It then executes the tlc2.TLC model checker
with the given model. with the given model.
Note: The TLA+ specification file is a relative path. Note: The TLA+ specification file is a relative path.
" "
@ -609,7 +609,7 @@ Note: The TLA+ specification file is a relative path.
(file-name-base (buffer-file-name)) (file-name-base (buffer-file-name))
".cfg" )))) ".cfg" ))))
(if (not tla+-tlatools-path) (if (not tla+-tlatools-path)
(error "need the TLA+ toolbox java archive: tla+-tlatools-path")) (error "need the TLA+ toolbox java archive: tla+-tlatools-path"))
(let* ((filename (buffer-file-name)) (let* ((filename (buffer-file-name))
(tlcbufname (format "*tlc2.TLC* [%s]" (buffer-name))) (tlcbufname (format "*tlc2.TLC* [%s]" (buffer-name)))
;(tlcbuffer (get-buffer-create ;(tlcbuffer (get-buffer-create
@ -642,12 +642,13 @@ Note: The TLA+ specification file is a relative path.
opt-simulate " " opt-simulate " "
opt-depth " " opt-depth " "
tla+-tlc-coverage " " tla+-tlc-coverage " "
opt-workers " " opt-workers " "
" -config " cfgfile " " " -config " cfgfile " "
finame)) finame))
(output (shell-command-to-string cmd)) (output (shell-command-to-string cmd))
(dot (tla+-run-dot))) (dot (tla+-run-dot)))
(save-excursion (save-excursion
(message (concat "Ran cmd: " cmd))
(if tlcbuffer (if tlcbuffer
(progn (progn
(switch-to-buffer tlcbuffer) (switch-to-buffer tlcbuffer)
@ -667,14 +668,14 @@ Note: The TLA+ specification file is a relative path.
(setq buffer-read-only 't) (setq buffer-read-only 't)
(other-window 1))))))) (other-window 1)))))))
(defun tla+-run-pluscal () (defun tla+-run-pluscal ()
"This function runs pcal.trans (PlusCal Translator to TLA+) "This function runs pcal.trans (PlusCal Translator to TLA+)
This function executes the PlusCal Translator on the current This function executes the PlusCal Translator on the current
buffer (Assumption: the buffer is a TLA+ buffer that contains buffer (Assumption: the buffer is a TLA+ buffer that contains
PlusCal code). PlusCal code).
On success, the buffer will be reloaded and a message will be On success, the buffer will be reloaded and a message will be
printed. On failure (i.e. the exit code of the shell command printed. On failure (i.e. the exit code of the shell command
was not 0), an error message will be printed. was not 0), an error message will be printed.
" "
(interactive) (interactive)
@ -683,7 +684,7 @@ was not 0), an error message will be printed.
".tla$" ".old" filename)) ".tla$" ".old" filename))
(pcalbuf (get-buffer-create (pcalbuf (get-buffer-create
(format "*pcal.trans* [%s]" (buffer-name)))) (format "*pcal.trans* [%s]" (buffer-name))))
(cmd (concat (cmd (concat
tla+-java-path " -cp " tla+-tlatools-path tla+-java-path " -cp " tla+-tlatools-path
" pcal.trans "filename )) " pcal.trans "filename ))
(output (shell-command cmd))) (output (shell-command cmd)))
@ -705,8 +706,8 @@ was not 0), an error message will be printed.
(insert (insert
(shell-command-to-string cmd)) (shell-command-to-string cmd))
(message "Translation Failed"))))) (message "Translation Failed")))))
(defun tla+-open-dvi (buffername) (defun tla+-open-dvi (buffername)
"Function to open a DVI file. "Function to open a DVI file.
@ -756,7 +757,7 @@ as DVI file.
(defun tla+-operator-unchanged () (defun tla+-operator-unchanged ()
"insert UNCHANGED operator. "insert UNCHANGED operator.
Variables declared as unchanged will have the same value when a Variables declared as unchanged will have the same value when a
step is taken to a new state, i.e. e' = e. " step is taken to a new state, i.e. e' = e. "
(interactive) (insert " UNCHANGED e")) (interactive) (insert " UNCHANGED e"))
(defun tla+-operator-cdot () (defun tla+-operator-cdot ()
@ -804,18 +805,18 @@ The function executes one or two shell commands synchronously."
(defun tla+-run-tlatex-pdf () (defun tla+-run-tlatex-pdf ()
"Create PDF file from TLA+ Specification. "Create PDF file from TLA+ Specification.
This function creates a PDF file of a TLA+ Specification by This function creates a PDF file of a TLA+ Specification by
`tla+-run-tlatex'" `tla+-run-tlatex'"
(interactive) (tla+-run-tlatex 'pdf)) (interactive) (tla+-run-tlatex 'pdf))
(defun tla+-run-tlatex-dvi () (defun tla+-run-tlatex-dvi ()
"Create DVI file from TLA+ Specification. "Create DVI file from TLA+ Specification.
This function creates a DVI file of a TLA+ Specification by This function creates a DVI file of a TLA+ Specification by
`tla+-run-tlatex'" `tla+-run-tlatex'"
(interactive) (tla+-run-tlatex 'dvi)) (interactive) (tla+-run-tlatex 'dvi))
(defun tla+-run-tlatex-ps () (defun tla+-run-tlatex-ps ()
"Create PS file from TLA+ Specification. "Create PS file from TLA+ Specification.
This function creates a PS file of a TLA+ Specification by This function creates a PS file of a TLA+ Specification by
`tla+-run-tlatex'" `tla+-run-tlatex'"
(interactive) (tla+-run-tlatex 'ps)) (interactive) (tla+-run-tlatex 'ps))
@ -833,8 +834,8 @@ This function creates a PS file of a TLA+ Specification by
(defun tla+/sany-button-pressed (button) (defun tla+/sany-button-pressed (button)
"Find the position and goto a sany error position. "Find the position and goto a sany error position.
This function will be executed when a user clicks on a button inside This function will be executed when a user clicks on a button inside
the SANY error report buffer. This is done by selecting the other the SANY error report buffer. This is done by selecting the other
window and going to the line mentioned in the error message. window and going to the line mentioned in the error message.
The parameter BUTTON is currently unused. The parameter BUTTON is currently unused.
@ -843,7 +844,7 @@ Steps done by this function:
2. get the text label of the button which is usually a line like 2. get the text label of the button which is usually a line like
line XX, column YY line XX, column YY
3. Get line number and column count of the error message 3. Get line number and column count of the error message
4. select the other-window (it is assumed that this is the *.tla 4. select the other-window (it is assumed that this is the *.tla
specification where SANY was executed. specification where SANY was executed.
5. goto line and column. 5. goto line and column.
" "
@ -873,16 +874,16 @@ Steps done by this function:
(defun tla+/make-link-button (begin end) (defun tla+/make-link-button (begin end)
"Generate button from BEGIN until END "Generate button from BEGIN until END
This function generates a new button starting at BEGIN until END. This function generates a new button starting at BEGIN until END.
The button will execute the `tla+/sany-button-pressed' when a user The button will execute the `tla+/sany-button-pressed' when a user
clicks on it. clicks on it.
" "
(make-button begin end :type 'tla+/sany-button-pressed)) (make-button begin end :type 'tla+/sany-button-pressed))
(defun tla+/find-error-marks () (defun tla+/find-error-marks ()
"find error marks reported by SANY. "find error marks reported by SANY.
This function tries to find errors reported by SANY and converts them This function tries to find errors reported by SANY and converts them
into clickable buttons. By clicking on an error, the point will be into clickable buttons. By clicking on an error, the point will be
set to the other-buffer on that particular line and column. Currently set to the other-buffer on that particular line and column. Currently
supported: supported:
line XX, column YY line XX, column YY
@ -890,7 +891,7 @@ supported:
XX,YY are natural numbers. XX,YY are natural numbers.
The procedure works by: The procedure works by:
1. finding a line that may look like an error message as described 1. finding a line that may look like an error message as described
above. above.
2. find the first offset and the last one 2. find the first offset and the last one
3. execute the `tla+/make-link-button' function to create a new button 3. execute the `tla+/make-link-button' function to create a new button
@ -898,7 +899,7 @@ The procedure works by:
(progn (progn
(goto-char (point-min)) (goto-char (point-min))
(while (re-search-forward (while (re-search-forward
(concat (concat
"line \\([0-9][0-9]*\\), " "line \\([0-9][0-9]*\\), "
"\\(column\\|col\\) " "\\(column\\|col\\) "
"\\([0-9][0-9]*\\)") "\\([0-9][0-9]*\\)")
@ -1002,7 +1003,7 @@ The procedure works by:
:size 18 :size 18
:format "Init..............: %v " "Init")) :format "Init..............: %v " "Init"))
(widget-insert "\n") (widget-insert "\n")
(setq widget-tlc-next (setq widget-tlc-next
(widget-create 'editable-field (widget-create 'editable-field
:size 18 :size 18
@ -1028,7 +1029,7 @@ The procedure works by:
(setq widget-tlc-inv widget)) (setq widget-tlc-inv widget))
:value '() :value '()
'(editable-field :value "Spec => TypeInv"))) '(editable-field :value "Spec => TypeInv")))
(widget-insert (widget-insert
"\nList of Constants (CONSTANTS): \n") "\nList of Constants (CONSTANTS): \n")
(setq widget-tlc-constant (setq widget-tlc-constant
@ -1053,7 +1054,7 @@ The procedure works by:
(widget-insert "--------------------------------------") (widget-insert "--------------------------------------")
(widget-insert "\nTLC Options\n\n") (widget-insert "\nTLC Options\n\n")
(widget-insert "No Deadlocks.......: " ) (widget-insert "No Deadlocks.......: " )
(widget-create 'checkbox (widget-create 'checkbox
:notify :notify
(lambda (&rest ignore) (lambda (&rest ignore)
(let ((cfgtlc (let ((cfgtlc
@ -1075,13 +1076,13 @@ The procedure works by:
(tla+/add-option (tla+/add-option
cfgtlc cfgtlc
'tla+-tlc-deadlock 'tla+-tlc-deadlock
" ") " ")
)))) ))))
nil nil
) )
(widget-insert "\nSimulation Mode....: ") (widget-insert "\nSimulation Mode....: ")
(widget-create 'checkbox (widget-create 'checkbox
:notify :notify
(lambda (&rest ignore) (lambda (&rest ignore)
(let ((cfgtlc (let ((cfgtlc
@ -1204,7 +1205,7 @@ The procedure works by:
"%s\n" "%s\n"
"\n") "\n")
str-confname str-confname
(current-time-string) (current-time-string)
(if (not (string= str-specname "")) "" (if (not (string= str-specname "")) ""
(concat "INIT " str-init "\n" (concat "INIT " str-init "\n"
"NEXT " str-next "\n")) "NEXT " str-next "\n"))