[comp.sources.misc] v07i038: CRISP release 1.9 part 17/32

allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) (07/23/89)

Posting-number: Volume 7, Issue 38
Submitted-by: fox@marlow.UUCP (Paul Fox)
Archive-name: crisp1.9/part18



#!/bin/sh
# this is part 4 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file src/crisp/makeman.m continued
#
CurArch=4
if test ! -r s2_seq_.tmp
then echo "Please unpack part 1 first!"
     exit 1; fi
( read Scheck
  if test "$Scheck" != $CurArch
  then echo "Please unpack part $Scheck next!"
       exit 1;
  else exit 0; fi
) < s2_seq_.tmp || exit 1
echo "x - Continuing file src/crisp/makeman.m"
sed 's/^X//' << 'SHAR_EOF' >> src/crisp/makeman.m
X			(+ " 2 \"Macros to help writing Programs\"\n" END_SECTION))))
X		(process_file "features/Program.hlp")
X		(insert (+ "\n" (+ START_SECTION 
X			(+ " 2 \"Macros for Manipulating Regions\"\n" END_SECTION))))
X		(process_file "features/Region.hlp")
X		(insert (+ "\n" (+ START_SECTION 
X			(+ " 2 \"Macros for accessing sub-shells\"\n" END_SECTION))))
X		(process_file "features/Shell.hlp")
X		(insert (+ "\n" (+ START_SECTION 
X			(+ " 2 \"Macro for Counting Words.\"\n" END_SECTION))))
X		(process_file "features/Wc.hlp")
X		(insert (+ "\n" (+ START_SECTION 
X			(+ " 2 \"Calculator\"\n" END_SECTION))))
X		(process_file "features/Calc.hlp")
X		(insert (+ "\n" (+ START_SECTION 
X			(+ " 2 \"Ascii Wall Chart.\"\n" END_SECTION))))
X		(process_file "features/Ascii.hlp")
X	)
X)
X(macro chapter_5
X	(				
X		(read_file (+ BHELP "roff/Lang.mm"))
X		(insert (+ "\n" (+ START_SECTION 
X			(+ " 2 \"Macros and their Syntax\"\n" END_SECTION))))
X		(process_file "lang/Macros.hlp")
X		(insert (+ "\n" (+ START_SECTION 
X			(+ " 2 \"Language Data Types\"\n" END_SECTION))))
X		(process_file "lang/Vars.hlp")
X		(insert (+ "\n" (+ START_SECTION 
X			(+ " 2 \"The Macro Compiler\"\n" END_SECTION))))
X		(process_file "lang/Compiler.hlp")
X	)
X)
X(macro end_processing
X	(
X		(top_of_buffer)
X		(translate "^.page_size$" PAGE_LENGTH 0)
X		(top_of_buffer)
X		(translate "CRISP" "\\\\fBCRISP\\\\fR" ST_GLOBAL)
X		(top_of_buffer)
X		(translate "BRIEF" "\\\\fBBRIEF\\\\fR" ST_GLOBAL)
X		(top_of_buffer)
X		(while (> (search_fwd "^.H") 0) (
X			(down)
X			(delete_line)
X			(insert ".sp\n")
X			))
X		(end_of_buffer)
X		(insert "\n.TC\n")
X		(switch MACROS
X			ME			(me_end_processing)
X			MS			(ms_end_processing)
X			)
X	)
X)
X# define	WORDFILE	"/tmp/word-file"
X
X(macro make_index
X	(
X		(int	srcbuf)
X		 
X		(if (! INDEXING)
X			(return))
X		(= srcbuf (inq_buffer))
X		
X		(edit_file WORDFILE)
X		(clear_buffer)
X		(message "Inserting index entries...")
X		
X		(read_file (+ BHELP  "/sections/Arith"))
X		(read_file (+ BHELP  "/sections/Buffer"))
X		(read_file (+ BHELP  "/sections/Debug"))
X		(read_file (+ BHELP  "/sections/Env"))
X		(read_file (+ BHELP  "/sections/File"))
X		(read_file (+ BHELP  "/sections/Kbd"))
X		(read_file (+ BHELP  "/sections/List"))
X		(read_file (+ BHELP  "/sections/Macro"))
X		(read_file (+ BHELP  "/sections/Misc"))
X		(read_file (+ BHELP  "/sections/Movement"))
X		(read_file (+ BHELP  "/sections/Proc"))
X		(read_file (+ BHELP  "/sections/Scrap"))
X		(read_file (+ BHELP  "/sections/Screen"))
X		(read_file (+ BHELP  "/sections/Search"))
X		(read_file (+ BHELP  "/sections/String"))
X		(read_file (+ BHELP  "/sections/Var"))
X		(read_file (+ BHELP  "/sections/Window"))
X		(sort_buffer)
X		(uniq)
X		(gen_index srcbuf WORDFILE)
X		(set_buffer srcbuf)
X	)
X)
X(macro gen_index
X	(
X		(string	
X					wordfile
X					word
X					raw_word		/* Word before quote_regexp gets hold of it*/
X					regexp1		/* Used for fast find of possible match */
X					regexp2		/* Used to locate exact match.			 */
X					index_string
X					)
X					
X		(int		srcbuf
X					word_line
X					)
X
X		(get_parm 0 srcbuf)
X		(get_parm 1 wordfile)
X		
X		(edit_file wordfile)
X		(= word_line 1)
X		
X		/*----------------------------------------
X		/*   For each word in the index file,
X		/*   scan the source file and insert .tm
X		/*   requests into the source buffer.
X		/*----------------------------------------*/
X		(while (<= word_line (inq_lines)) (
X			(goto_line word_line)
X			(= raw_word (trim (ltrim (read))))
X			(= word (quote_regexp raw_word))
X			(message "Indexing '%s'..." word)
X			
X			(set_buffer srcbuf)
X			(top_of_buffer)
X
X			(= regexp1 (+ "B" (+ word "\\\\")))
X			(= regexp2 (+ "B" (+ word "\\")))
X			(= index_string (+ ".tm " (+ "(\\f(HB" (+ raw_word "\\fR) \\n%\n"))))
X			(while (> (search_fwd regexp1) 0) (
X				(beginning_of_line)
X				(down)
X				(beginning_of_line)
X				(insert index_string)
X				))
X			(edit_file wordfile)
X			(++ word_line)
X			))
X		(set_buffer srcbuf)
X		(attach_buffer srcbuf)
X	)
X)
X(macro uniq
X	(
X		(string str1 str2)
X		/*----------------------------------------
X		/*    Remove all duplicate lines.
X		/*----------------------------------------*/
X		(top_of_buffer)
X		(= str1 (read))
X		(= str2 "xx")
X		(message "Removing duplicates...")
X		(while (!= str2 "\n") (
X			(= str2 (read))
X			(if (== str1 str2)
X				(delete_line)
X			;else
X				(
X					(= str1 str2)
X					(down)
X				))
X			))
X	)
X)
X(macro format_index
X	(
X		(string	str1
X					str2
X					token1
X					token2
X					word
X					page_list
X					)
X					
X		/*----------------------------------------
X		/*    First sort all lines into order.
X		/*    We have to make all single and double
X		/*    digit numbers have leading zero's other
X		/*    wise the sort comes out wrong.
X		/*----------------------------------------*/
X		(top_of_buffer)
X		(translate " {[0-9]}$" " 0\\0" ST_GLOBAL)
X		(top_of_buffer)
X		(translate " {[0-9][0-9]}$" " 0\\0" ST_GLOBAL)
X		(sort_buffer)
X		(uniq)
X		
X		(top_of_buffer)
X		(= str1 (read))
X		(= str2 "xx")
X		(message "Merging duplicates...")
X		(while (!= str2 "\n") (
X			(= str2 (read))
X			(= token1 (substr str1 1 (index str1 " ")))
X			(= token2 (substr str2 1 (index str2 " ")))
X			(if (!= token1 token2) (
X				(= str1 str2)
X				(down)
X				(continue)))
X			(= word token1)
X			(= page_list (trim (substr str1 (+ (index str1 " ") 1))))
X			(+= page_list (+ "," (trim (substr str2 (index str2 " ")))))
X			(= str1 (+ word page_list))
X			(up)
X			(delete_line)
X			(delete_line)
X			(insert (+ str1 "\n"))
X			))
X		/*----------------------------------------
X		/*   Now remove all leading zeros.
X		/*----------------------------------------*/
X		(top_of_buffer)
X		(translate " 0+" " " ST_GLOBAL)
X		(top_of_buffer)
X		(translate " 0+{[1-9]}" " \\0" ST_GLOBAL -2)
X		(top_of_buffer)
X		(translate ") " ")  . . . " ST_GLOBAL)
X		(top_of_buffer)
X		(translate "^" ".br\n" ST_GLOBAL)
X		(top_of_buffer)
X		(insert ".2C\n")
X		(write_buffer)
X		(message "Index table generated.")
X	)
X)
X
X(macro process_file
X	(
X		(string filename)
X		
X		(get_parm 0 filename)
X		(message "Processing %s..." filename)
X		(= filename (+ BHELP filename))
X		(save_position)
X		(read_file filename)
X		(restore_position)
X		
X		(convert_buffer)
X	)
X)
X(macro convert_buffer
X	(
X		(int	line)
X		(string	str str1)
X		
X		(inq_position line)
X		
X		//
X		//    First make all multiple spaces into single spaces.
X		//    This unformats the justified text.
X		//
X		(translate "   @" " " ST_GLOBAL -1)
X		//
X		//    Make section headings into nroff section headings.
X		//
X		(goto_line line)
X		(translate "^\\> {*$}" ".H 3 \"\\0\"" ST_GLOBAL)
X		//
X		//    Put in paragraph marks.
X		//
X		(goto_line line)
X		(translate "^$" NEW_PARA ST_GLOBAL)
X		//
X		//    Now make indented blocks into lists.
X		//
X		(goto_line line)
X		(do_DL_list)
X		(goto_line line)
X		(do_VL_list)
X		(goto_line line)
X		(do_AL_list)
X		//
X		//    Create fixed displays.
X		//
X		(goto_line line)
X		(while (> (search_fwd "^ ") 0) (
X			(insert NEW_PARA)
X			(insert "\n.in +1i\n")
X			(insert ".ft CW\n")
X			(while 1 (
X				(down)
X				(if (!= (read 1) " ")
X					(break))
X				(insert ".br\n")
X				))
X			(insert ".ft R\n")
X			(insert ".in -1i\n")
X			))
X		//
X		//    Translate all funny characters.
X		//
X		(goto_line line)
X		(translate "\\\\" "\\\\\\\\" ST_GLOBAL)
X		//
X		//    Translate all funny characters.
X		//
X		(goto_line line)
X		(translate "^'" "\\\\'" ST_GLOBAL)
X		(goto_line line)
X		(translate "~" "\\\\~" ST_GLOBAL)
X		//
X		//    Boldify all CRISP macro names.
X		//
X		(translate "({[a-z_]+})" "(\\\\fB\\0\\\\fR)" ST_GLOBAL)
X		(end_of_buffer)
X	)
X)
X(macro do_DL_list
X	(
X		(int	line)
X		
X		(while (> (search_fwd "^\t-[ \t]") 0) (
X			(insert ".DL\n")
X			/*----------------------------------------
X			/*  Mark the region containing the current
X			/*  list.
X			/*----------------------------------------*/
X			(inq_position line)
X			(if (<= (search_fwd "^[A-Z.]") 0) (
X				(end_of_buffer)
X				(next_char)))
X			(insert ".LE\n")
X			(up)
X			(drop_anchor MK_LINE)
X			/*----------------------------------------
X			/*  Now modify the entries.
X			/*----------------------------------------*/
X			(move_abs line 1)
X			(translate "^\t-?" ".LI\n" ST_GLOBAL NULL NULL ST_BLOCK)
X			(move_abs line 1)
X			(translate "^\t\t" "" ST_GLOBAL NULL NULL ST_BLOCK)
X			(raise_anchor)
X			))
X	)
X)
X(macro do_VL_list
X	(
X		(int	line)
X
X		(while (> (search_fwd "^\t-[^\t ]") 0) (
X			(insert ".VL 10\n")
X			/*----------------------------------------
X			/*  Mark the region containing the current
X			/*  list.
X			/*----------------------------------------*/
X			(inq_position line)
X			(if (<= (search_fwd "^[A-Z]") 0) (
X				(end_of_buffer)
X				(next_char)))
X			(insert ".LE\n")
X			(up)
X			(drop_anchor MK_LINE)
X			/*----------------------------------------
X			/*  Now modify the entries.
X			/*----------------------------------------*/
X			(move_abs line 1)
X			(translate "^\t{-*}\t{*$}" ".LI \\0\n\\1" ST_GLOBAL NULL NULL ST_BLOCK)
X			(move_abs line 1)
X			(translate "^\t\t" "" ST_GLOBAL NULL NULL ST_BLOCK)
X			(raise_anchor)
X			))
X	)
X)
X(macro do_AL_list
X	(
X		(int	line)
X
X		(while (> (search_fwd "^\t[1-9]") 0) (
X			(insert ".AL\n")
X			/*----------------------------------------
X			/*  Mark the region containing the current
X			/*  list.
X			/*----------------------------------------*/
X			(inq_position line)
X			(if (<= (search_fwd "^[A-Z]") 0) (
X				(end_of_buffer)
X				(next_char)))
X			(insert ".LE\n")
X			(up)
X			(drop_anchor MK_LINE)
X			/*----------------------------------------
X			/*  Now modify the entries.
X			/*----------------------------------------*/
X			(move_abs line 1)
X			(translate "^\t[1-9]+. " ".LI\n" ST_GLOBAL NULL NULL ST_BLOCK)
X			(move_abs line 1)
X			(translate "^\t  @" "" ST_GLOBAL NULL NULL ST_BLOCK)
X			(raise_anchor)
X			))
X	)
X)
X(macro process_sections
X	(
X		(string section)
X		(int	line)
X		
X		(save_position)
X		(read_file (+ BHELP "roff/Prim.mm"))
X		(restore_position)
X		(while (> (search_fwd "<##") 0) (
X			(= section (substr (trim (read)) 3))
X			(delete_line)
X			(insert ".sp 2\n")
X			(drop_anchor MK_LINE)
X			(read_file (+ BHELP (+ "sections/" section)))
X			(insert "\n")
X			(up)
X			(message (+ BHELP (+ "sections/" section)))
X			(translate "^{?*}$" ".ce\n(\\\\f(HB\\0\\\\fR)" ST_GLOBAL NULL NULL ST_BLOCK)
X			(raise_anchor)
X			(down)
X			))
X		(end_of_buffer)
X		(down)
X		(beginning_of_line)
X	)
X)
X(macro process_prim
X	(
X		(int	line)
X		(string	str str1)
X		
X		(restore_position)
X		(insert ".in +.5i\n")
X		(insert "\\s-2\n")
X		(inq_position line)
X		
X		//
X		//    Make sections stand out.
X		//
X		(message "Removing multiple spaces.")
X		(goto_line line)
X		(translate "   @" " " ST_GLOBAL -1)
X		(goto_line line)
X		(message "Removing tabs at beginning of lines.")
X		(translate "^\t" "" ST_GLOBAL)
X		(goto_line line)
X		(message "Center macro name.")
X		(while (> (search_fwd "<.HU") 0) (
X			(delete_line)
X			(translate "S*(" "(" 0)
X			(beginning_of_line)
X			(insert ".sp 1\n")
X			(insert ".DS CB\n")
X			(insert "\\s+3\\f(HB\n.ce\n")
X			(insert "___________________________________________________\n\n")
X			(while (!= (= str (read)) "\n") (
X				(insert ".ce\n")
X				(insert (ltrim str))
X				(delete_line)
X				))
X			(insert "\\s0\\fR\n")
X			(insert ".DE")
X			))
X		(message "Processing lists.")
X		(goto_line line)
X		(while (> (search_fwd "^\t") 0) (
X			(insert ".in +.5i\n")
X			(insert ".VL 20\n")
X			(while (== (read 1) "\t") (
X				(delete_char)
X				(insert ".LI \"")
X				(search_fwd "\t|$")
X				(if (== (read 1) "\t") (
X					(delete_char)
X					(insert "\"\n")
X					(down)
X					)
X				;else
X					(
X						(insert "\"")
X						(next_char)
X					))
X				(while (== (read 2) "\t\t") (
X					(delete_char 2)
X					(while (== (read 1) "\t")
X						(delete_char))
X					(down)))
X				))
X			(insert ".LE\n")
X			(insert ".in -.5i\n")
X			))
X		(message "Rearranging descriptions and return.")
X		(goto_line line)
X		(while (> (search_fwd "<RETURN") 0) (
X			(delete_line)
X			(delete_line)
X			
X			(save_position)
X			(drop_anchor MK_LINE)
X			(insert ".sp\n.Fo \"RETURN\\ VALUE\"\n")
X			(search_fwd "<{.sp 1}|{DESC}")
X			(up)
X			(cut)
X			(search_fwd "<{.sp 1}|{EX}")
X			(paste)
X			(restore_position)
X			(delete_line)
X			(insert ".Fo \"DESCRIPTION\"")
X			))
X		(message "Making examples into Courier.")
X		(goto_line line)
X		(translate "^ {*$}" "\\\\f(CW\\0\\\\fR\n.br" ST_GLOBAL)
X		(goto_line line)
X		(message "Renaming Examples heading.")
X		(translate "EXAMPLES:" ".Fo \"EXAMPLES\"" ST_GLOBAL)
X		(goto_line line)
X		(message "Making macros stand out.")
X		(translate "({[a-z_]+}){?}" "(\\\\fB\\0\\\\fR)\\1" ST_GLOBAL)
X		(goto_line line)
X		(end_of_buffer)
X		(down)
X		(beginning_of_line)
X		(insert ".in -.5i\n")
X		(insert "\\s+2\n")
X	)
X)
SHAR_EOF
echo "File src/crisp/makeman.m is complete"
chmod 0444 src/crisp/makeman.m || echo "restore of src/crisp/makeman.m fails"
mkdir src src/crisp >/dev/null 2>&1
echo "x - extracting src/crisp/misc.m (Text)"
sed 's/^X//' << 'SHAR_EOF' > src/crisp/misc.m &&
X/********************************************************************
X *                                                                  *
X *      CRISP - Custom Reduced Instruction Set Programmers Editor   *
X *                                                                  *
X *      (C) Paul Fox, 1989                                          *
X *      43, Jerome Close                Tel: +44 6284 4222          *
X *          Marlow                                                  *
X *           Bucks.                                                 *
X *              England SL7 1TX                                     *
X *                                                                  *
X *                                                                  *
X *    Please See COPYRIGHT notice.                                  *
X *                                                                  *
X ********************************************************************/
X# include	"crisp.h"
X
X(macro autoindent
X	(
X		(string	arg)
X		
X		(get_parm 0 arg "Turn autoindent on (y/n) ? ")
X		(if (== (upper (substr arg 1 1)) "Y")
X			(assign_to_key "<Enter>" "_indent")
X		;else
X			(assign_to_key "<Enter>" "self_insert"))
X	)
X)
X(macro _indent
X	(
X		(int col)
X		
X		(if (& (inq_buffer_flags) BF_READONLY) (
X			(down)
X			(beginning_of_line)
X			(return)))
X		(insert "\n")
X		(save_position)
X
X		(if (<= (search_back "[~ \t]") 0) (
X			(restore_position)
X			(return)))
X
X		(beginning_of_line)
X		(search_fwd "[~ \t]")
X		(inq_position NULL col)
X		(restore_position)
X		(tab_to_col col)
X	)
X)
X/*************************************************************
X/*   Macro to move the cursor back to the previous tab stop. *
X/*   This macro will not move the cursor beyond the beginning*
X/*   of the current line.												 *
X/*************************************************************/
X(macro previous_tab
X	(
X		(int	
X				col
X				num
X				prev_num)
X		
X		/*----------------------------------------
X		/*   If we are already in column 1, dont go
X		/*   back any further.
X		/*----------------------------------------*/
X		(inq_position NULL col)
X		(if (== col 1)
X			(return))
X		(left)
X		(= prev_num (distance_to_tab))
X		(while 1 (
X			(= num (distance_to_tab))
X			(inq_position NULL col)
X			(if (< num prev_num) (
X				(right)
X				(break)))
X			(if (== col 1)
X				(break))
X			(= prev_num num)
X			(left)
X			))
X	)
X)
X
X(macro tab_to_col
X	(
X		(int	col curcol hard_tabs)
X		(get_parm 0 col)
X		(beginning_of_line)
X		(= hard_tabs (use_tab_char "y"))
X		(use_tab_char (if hard_tabs "y" "n"))
X		(if (! hard_tabs) (
X			(insert " " (- col 1))
X			(return)
X			))
X		(while 1 (
X			(inq_position NULL curcol)
X			(if (>= curcol col)
X				(break))
X			(insert "\t")
X			))
X		(if (> curcol col) (
X			(backspace)
X			(inq_position NULL curcol)
X			(insert " " (- col curcol))))
X	)
X)
X
X(macro display_file_name
X	(
X		(string 	filename buf)
X		(int		cols len)
X
X		(inq_names filename)
X		(inq_screen_size NULL cols)
X		(-= cols 43)
X		(= len (strlen filename))
X		(if (> len cols) (
X			(= filename (substr filename (- len cols)))
X			(= filename (+ "..." filename))
X			))
X		(message "File: %s%s" filename (if (inq_modified) "*" ""))
X	)
X)
X(macro repeat
X	(
X		(int	count
X				ch)
X		(string macro_name)
X
X		(= count 0)
X		(while 1 (
X			(message "Repeat count = %d" count)
X			(while (== (= ch (read_char)) -1)
X				(nothing))
X			(if (&& (>= ch '0') (<= ch '9')) (
X				(= count (+ (* count 10) (- ch '0')))
X				(continue)))
X			(if (== (int_to_key ch) "<Esc>") (
X				(message "Repeat aborted.")
X				(return)))
X			(if (== (int_to_key ch) "<Ctrl-r>") (
X				(if (== count 0)
X					(= count 1))
X				(*= count 4)
X				(continue)))
X			(break)
X			))
X		(= macro_name (inq_assignment (int_to_key ch)))
X		(while (> count 0) (
X			(execute_macro macro_name)
X			(-- count)
X			))
X	)
X)
X(macro home
X	(
X		(int	line col)
X
X		(inq_position line col)
X		(if (|| (!= line click_line) (!= col click_col))
X			(= click_state 1))
X		(switch click_state
X			2		(top_of_window)
X			3		(top_of_buffer)
X			NULL	(
X						(beginning_of_line)
X						(= click_state 1)
X					)
X			)
X		(inq_position click_line click_col)
X		(++ click_state)
X	)
X)
X(macro end
X	(
X		(int	line col)
X
X		(inq_position line col)
X		(if (|| (!= line click_line) (!= col click_col))
X			(= click_state -1))
X		(switch click_state
X			-2		(end_of_window)
X			-3		(end_of_buffer)
X			NULL	(
X						(end_of_line)
X						(= click_state -1)
X					)
X			)
X		(inq_position click_line click_col)
X		(-- click_state)
X	)
X)
X(macro quote
X	(
X		(int	key)
X		(string buf)
X
X		(= key -1)
X		(while (< key 0)
X			(= key (read_char)))
X		(sprintf buf "%c" key)
X		(insert buf)
X	)
X)
X(macro delete_character
X	(
X		(if (|| (!= (inq_called) "") (== (inq_marked) 0))
X			(return (delete_char)))
X		(if (== (inq_marked) MK_COLUMN)
X			(block-delete)
X		;else
X			(delete_block))
X	)
X)
X(replacement write_buffer
X	(
X		(int	ret 
X				old_msg_level)
X
X		(if (!= (inq_called) "")
X			(return (write_buffer))
X		;else
X			(
X				(= old_msg_level (inq_msg_level))
X				(if (inq_marked)
X					(
X						(set_msg_level 1)
X						(= ret (write_block))
X					)
X				;else
X					(
X						(set_msg_level 0)
X						(= ret (write_buffer))
X					))
X				(set_msg_level old_msg_level)
X				(return ret)
X			))
X	)
X)
X(macro _init
X	(
X		(int		click_line 
X					click_col 
X					click_state
X					search-regexp
X					search-case
X					search-block
X					)
X		(global	click_line 
X					click_col 
X					click_state
X					search-regexp
X					search-case
X					search-block
X					)
X	)
X)
X
SHAR_EOF
chmod 0444 src/crisp/misc.m || echo "restore of src/crisp/misc.m fails"
mkdir src src/crisp >/dev/null 2>&1
echo "x - extracting src/crisp/options.m (Text)"
sed 's/^X//' << 'SHAR_EOF' > src/crisp/options.m &&
X/********************************************************************
X *                                                                  *
X *      CRISP - Custom Reduced Instruction Set Programmers Editor   *
X *                                                                  *
X *      (C) Paul Fox, 1989                                          *
X *      43, Jerome Close                Tel: +44 6284 4222          *
X *          Marlow                                                  *
X *           Bucks.                                                 *
X *              England SL7 1TX                                     *
X *                                                                  *
X *                                                                  *
X *    Please See COPYRIGHT notice.                                  *
X *                                                                  *
X ********************************************************************/
X# include	"crisp.h"
X
X(macro options
X	(
X		(select_list "Options" ""
X			3
X			(quote_list
X				"Autoindenting"	"autoindent"			
X										"help_display \"features/Options.hlp\" \"Autoindenting\" \"> Autoindenting\""
X				"Documents"			"wp-options"
X										"help_display \"features/Options.hlp\" \"Documents\" \"> The Documents Option\""
X 				"Screen & Status"	"echo_line-options"
X										"help_display \"features/Options.hlp\" \"Status Line\" \"> The Status Line Option\""
X				"Searching" 		"search-options"
X										"help_display \"features/Options.hlp\" \"Searching\" \"> The Searching Option\""
X				"Tabs"				"tab-options"
X										"help_display \"features/Options.hlp\" \"Tabs\" \"> The Tabs Option\""
X				) 1)
X	)
X)
X(macro echo_line-options
X	(
X		(list	r_list s_list)
X		(int	options new_options ega_mode ega_mode1)
X
X		(= options (echo_line))
X		(= ega_mode (if (== 43 (ega)) 1 0))
X		(put_nth 0 r_list ega_mode)
X		(put_nth 1 r_list (if (& options 0x01) 0 1))
X		(put_nth 2 r_list (if (& options 0x02) 0 1))
X		(put_nth 3 r_list (if (& options 0x04) 0 1))
X		(put_nth 4 r_list (if (& options 0x08) 0 1))
X		(= s_list (quote_list
X			"EGA Mode              : " ("25-line" "43-line")
X			"Line prompt           : "	("On" "Off")
X			"Col prompt            : " ("On" "Off")
X			"Percent thru file     : " ("On" "Off")
X			"Time                  : " ("On" "Off")
X			))
X		(= r_list (field_list "Echo-Line Options" r_list s_list))
X		(= new_options 0)
X		
X		(= ega_mode1 (if (nth 0 r_list) 1 0))
X		(if (!= ega_mode1 ega_mode) 
X			(ega (if ega_mode1 43 25)))
X		(if (! (nth 1 r_list))
X			(+= new_options 0x01))
X		(if (! (nth 2 r_list))
X			(+= new_options 0x02))
X		(if (! (nth 3 r_list))
X			(+= new_options 0x04))
X		(if (! (nth 4 r_list))
X			(+= new_options 0x08))
X		(if (!= new_options options)
X			(echo_line new_options))
X	)
X)
X(macro tab-options
X	(
X		(list	r_list s_list)
X		(int	fill)
X
X		(= fill (use_tab_char "y"))
X		(use_tab_char (if fill "n" "y"))
X		(put_nth 0 r_list (if fill 0 1))
X		(= s_list (quote_list
X			"Fill with    : " ("SPACES" "TABS")
X         ))
X		(= r_list (field_list "Tab Options" r_list s_list))
X      (use_tab_char (if (== (nth 0 r_list) 0) "n" "y"))
X	)
X)
SHAR_EOF
chmod 0444 src/crisp/options.m || echo "restore of src/crisp/options.m fails"
mkdir src src/crisp >/dev/null 2>&1
echo "x - extracting src/crisp/region.m (Text)"
sed 's/^X//' << 'SHAR_EOF' > src/crisp/region.m &&
X/********************************************************************
X *                                                                  *
X *      CRISP - Custom Reduced Instruction Set Programmers Editor   *
X *                                                                  *
X *      (C) Paul Fox, 1989                                          *
X *      43, Jerome Close                Tel: +44 6284 4222          *
X *          Marlow                                                  *
X *           Bucks.                                                 *
X *              England SL7 1TX                                     *
X *                                                                  *
X *                                                                  *
X *    Please See COPYRIGHT notice.                                  *
X *                                                                  *
X ********************************************************************/
X# include	"crisp.h"
X
X(macro _init
X	(
X		(string block_line)
X		(global block_line)
X	)
X)
X(replacement copy
X	(
X		(int	old_msg_level)
X
X		(if (!= (inq_called) "")
X			(return (copy)))
X		(if (inq_marked) (
X			(= old_msg_level (inq_msg_level))
X			(set_msg_level 0)
X			(copy)
X			(set_msg_level old_msg_level)
X			(return)))
X
X		(drop_anchor MK_LINE)
X		(message "Line copied to scrap.")
X		(return (copy))
X	)
X)
X(replacement cut
X	(
X		(int	old_msg_level)
X
X		(if (!= (inq_called) "")
X			(return (cut)))
X		(if (inq_marked) (
X			(= old_msg_level (inq_msg_level))
X			(set_msg_level 0)
X			(cut)
X			(set_msg_level old_msg_level)
X			(return)))
X
X		(drop_anchor MK_LINE)
X		(message "Line cut to scrap.")
X		(return (cut))
X	)
X)
X;(replacement paste
X;	(
X;	)
X;)
X# define	BLOCK_REPLACE	1
X(macro block-upper_case
X	(
X		(block NULL (
X						(insert (upper block_line))
X						BLOCK_REPLACE
X						))
X	)
X)
X(macro block-lower_case
X	(
X		(block NULL (
X						(insert (lower block_line))
X						BLOCK_REPLACE
X						))
X	)
X)
X(macro block-delete
X	(
X		(block NULL (
X						BLOCK_REPLACE
X						))
X	)
X)
X(macro block
X	(
X		(int		type
X					start_line
X					start_col
X					end_line
X					end_col
X					col
X					result
X					size)
X		(string	macro_name
X					)
X		
X		(= type (inq_marked start_line start_col end_line end_col))
X		(if (== type 0) (
X			(error "No marked region.")
X			(return)))
X
X		(get_parm 0 macro_name)
X
X		(= col (if (== type MK_COLUMN) start_col 1))
X		(raise_anchor)
X
X		(move_abs start_line start_col)
X		(while (<= start_line end_line) (
X			(drop_anchor MK_NORMAL)
X			(save_position)
X			(if (|| (== type MK_COLUMN) (== start_line end_line))
X				(move_abs 0 end_col)
X			;else
X				(
X					(end_of_line)
X					(prev_char)
X				))
X			(= size (inq_mark_size))
X			(raise_anchor)
X			(restore_position)
X			(= block_line (read size))
X			(if (!= macro_name "")
X				(= result (execute_macro macro_name block_line))
X			;else
X				(get_parm 1 result))
X			(switch result
X				BLOCK_REPLACE	(delete_char size)
X				)
X			(++ start_line)
X			(move_abs start_line col) 
X			))
X		(move_abs end_line end_col)
X	)
X)
SHAR_EOF
chmod 0444 src/crisp/region.m || echo "restore of src/crisp/region.m fails"
mkdir src src/crisp >/dev/null 2>&1
echo "x - extracting src/crisp/regress.m (Text)"
sed 's/^X//' << 'SHAR_EOF' > src/crisp/regress.m &&
X/********************************************************************
X *                                                                  *
X *      CRISP - Custom Reduced Instruction Set Programmers Editor   *
X *                                                                  *
X *      (C) Paul Fox, 1989                                          *
X *      43, Jerome Close                Tel: +44 6284 4222          *
X *          Marlow                                                  *
X *           Bucks.                                                 *
X *              England SL7 1TX                                     *
X *                                                                  *
X *                                                                  *
X *    Please See COPYRIGHT notice.                                  *
X *                                                                  *
X ********************************************************************/
X;*******************************************************************
X;
X;	regress.m	- Regression testing file for CRISP.
X;
X; Paul Fox, (C) 1988
X;
X; Description:
X;
X;   This file is used when debugging and fixing CRISP to aid
X;   in regression testing - catching bugs introduced inadvertently.
X;
X;   This script does not attempt to exhaustively test CRISP, but tests
X;   are added whenever a bug is found, to ensure the bug does not get
X;   missed in the future.
X;
X;   The tests in this file are mainly to do with testing the 
X;   interpreter and simple aspects of the language. No attempt is
X;   made to test the correctnesss of the display, or reading/writing
X;   files.
X;
X;   This file can also be run after porting CRISP, to ensure that
X;   these tests work as expected. If anything doesn't work that should,
X;   the porter will hae to check for portability problems.
X;
X;   These tests attempt to do things in order of complexity.
X;
X;*******************************************************************
X
X# define	TRUE	1
X# define	FALSE	0
X
X(macro	regress
X	(
X		(int	i j k gi gj gk)
X		(int	num_passed num_failed)
X		(list	l1 l2 l3)
X		(declare	d1 d2 d3)
X		(string s1 s2 s3 gs1 gs2 gs3)
X		(global gs1 gs2 gs3 gi gj gk)
X		(int	buf old_buf)
X
X		(= old_buf (inq_buffer))
X		(= buf (create_buffer "Regression-Test" NULL 0))
X		(set_buffer buf)
X		(attach_buffer buf)
X
X		(top_of_buffer)
X		(drop_anchor 3)
X		(end_of_buffer)
X		(delete_block)
X		(top_of_buffer)
X
X		(= num_passed 0)
X		(= num_failed 0)
X
X		(= i (= j (= k 0)))
X		(= s1 "String one")
X		(= s2 "String two")
X		(= s3 "String three")
X
X		(if (!= i 0) (failed 1) (passed))
X		;;;;
X		(= s1 s2)
X		(if (!= s1 "String two") (failed 2) (passed))
X		;;;;
X		(if (!= s1 (+ "String two" "")) (failed 3) (passed))
X		;;;;
X		(= s1 (+ s2 s3))
X		(if (!= s1 "String twoString three") (failed 4) (passed))
X		;;;;
X		(= s1 (substr "ABC" -10000 20))
X		(if (!= s1 "ABC") (failed 5) (passed))
X		;;;;
X		(= s1 (substr "ABC" 10000 20))
X		(if (!= s1 "") (failed 6) (passed))
X		;;;;
X		(= s2 "HELLO")
X		(= s2 s2)
X		(if (!= s2 "HELLO") (failed 7) (passed))
X		;;;;
X		(= s2 "S2")
X		(= s1 (+ s2 (+ "-second-" s2)))
X		(if (!= s1 "S2-second-S2") (failed 8) (passed))
X		;;;;
X		(= s1 "variable")
X		(= k 99)
X		(if (! (test1_macro "literal-string" 23 s1 k)) (failed 9) (passed))
X		;;;;
X		(test2_macro i j k s1 s2 s3)
X		(if (!= k 27) (failed 10) (passed))
X		(if (!= s1 "literal") (failed 11) (passed))
X		(if (!= s2 "variable") (failed 12) (passed))
X		;;;;
X		(= k (if TRUE 2 3))
X		(if (!= k 2) (failed 13) (passed))
X		;;;;
X		(= s1 (if TRUE "abc" "def"))
X		(if (!= s1 "abc") (failed 14) (passed))
X		;;;;
X		(= s1 (if FALSE "abc" "def"))
X		(if (!= s1 "def") (failed 15) (passed))
X		;;;;
X		(= s2 "variable")
X		(= k 99)
X		(sprintf s1 "%s,%d,%s,%d" "literal" 1 s2 k)
X		(if (!= s1 "literal,1,variable,99") (failed 16) (passed))
X		;;;;
X		(if (!= (test3_macro) "XYZZY") (failed 17) (passed))
X		;;;;
X		(switch 3 1 (= k 101) 2 (= k 102) 3 (= k 103))
X		(if (!= k 103) (failed 18) (passed))
X		;;;;
X		(sprintf s1 "--%s--" (if 1 "abc" "def"))
X		(if (!= s1 "--abc--") (failed 19) (passed))		
X		;;;;
X		(if (test4_macro) (failed 20) (passed))
X		;;;;
X		(switch "hello" 
X				"hello, everybod" (= s1 "first") 
X				"hello" (= s1 "second")
X				NULL		(= s1 "default"))
X		(if (!= s1 "second") (failed 21) (passed))
X		;;;;
X		(= s1 "hello, everybod")
X		(= s2 "hello")
X		(switch "hello" 
X				s1 (= s1 "first") 
X				s2 (= s1 "second")
X				NULL		(= s1 "default"))
X		(if (!= s1 "second") (failed 22) (passed))
X		;;;;
X		(= s1 "")
X		(= s1 (substr s1 (+ (index s1 ";") 1)) )
X		(if (!= s1 "") (failed 23) (passed))
X		;;;;
X		(= gs1 "")
X		(get_parm 2 gs1)
X		(= gs1 (substr gs1 (+ (index gs1 ";") 1)) )
X		(if (!= gs1 "") (failed 24) (passed))
X		;;;;
X		(= s1 "xyz")
X		(+= s1 "abc")
X		(if (!= s1 "xyzabc") (failed 25) (passed))
X		;;;;
X		(= s1 "xyz")
X		(= s2 "abc")
X		(+= s1 s2)
X		(if (!= s1 "xyzabc") (failed 26) (passed))
X		;;;;
X		(= s1 "xyz")
X		(= s2 s1)
X		(+= s1 s2)
X		(if (!= s1 "xyzxyz") (failed 27) (passed))
X		;;;;
X		(if (!= (test5_macro) "XYZ") (failed 28) (passed))
X		;;;;
X		(= s1 "xyz")
X		(if (!= (+= s1 "abc") "xyzabc") (failed 29) (passed))
X		;;;;
X		(= s1 "xyz")
X		(if (!= (+= s1 s1) "xyzxyz") (failed 30) (passed))
X		;;;;
X		(= s1 "xyz")
X		(if (!= (= s1 s1) "xyz") (failed 31) (passed))
X		;;;;
X		(= l1 (quote_list 123 "xyz" (hello)))
X		(if (!= (length_of_list l1) 3) (failed 32) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(= l2 l1)
X		(if (!= (nth 0 l1) (nth 0 l2))  (failed 33) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(= d1 (nth 0 l1))
X		(if (! (is_integer d1))  (failed 34) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(= d1 (nth 1 l1))
X		(if (! (is_string d1))  (failed 35) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(= d1 (nth 2 l1))
X		(if (! (is_list d1))  (failed 36) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(= d1 (nth 3 l1))
X		(if (! (is_null d1))  (failed 37) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(= l1 (quote_list 1))
X		(put_nth 0 l1 2)
X		(if (!= (nth 0 l1) 2)  (failed 38) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(= l1 (quote_list 1 "abc"))
X		(put_nth 0 l1 2)
X		(if (!= (nth 0 l1) 2)  (failed 39) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(= l1 (quote_list "abc"))
X		(put_nth 0 l1 2)
X		(if (!= (nth 0 l1) 2)  (failed 40) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(= l1 (quote_list "abc" 1))
X		(put_nth 1 l1 2)
X		(if (!= (nth 1 l1) 2)  (failed 41) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(= l1 (quote_list 1 "abc" 3))
X		(put_nth 1 l1 2)
X		(if (!= (nth 1 l1) 2)  (failed 42) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(= l1 (quote_list 1 2 3))
X		(put_nth 1 l1 "abc")
X		(if (!= (nth 1 l1) "abc")  (failed 43) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(= l1 (quote_list 1 2 3))
X		(put_nth 1 l1 (quote_list (1 2 3)))
X		(if (!= (length_of_list l1) 3)  (failed 44) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(= l1 (quote_list 1 2 3))
X		(put_nth 1 l1 (quote_list (1 2 3)))
X		(if (!= (nth 2 l1) 3)  (failed 45) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(= d1 (nth 1 l1))
X		(if (!= (nth 2 d1) 3) (failed 46) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(put_nth 3 l1 "end")
X		(if (!= (nth 3 l1) "end") (failed 47) (passed))
X		(if (!= (length_of_list l1) 4) (failed 48) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(= l1 (quote_list ((1 2) (3 4) ("hello" "bye"))))
X		(= d1 (nth 1 l1))
X		(if (! (is_list d1)) (failed 49) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(put_nth 0 l3 0)
X		(put_nth 1 l3 1)
X		(put_nth 2 l3 2)
X		(if (!= (nth 0 l3) 0) (failed 50) (passed))
X		(if (!= (nth 1 l3) 1) (failed 51) (passed))
X		(if (!= (nth 2 l3) 2) (failed 52) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(= l1 NULL)
X		(if (!= (length_of_list l1) 0) (failed 53) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(put_nth 0 l1 "hello")
X		(if (!= (nth 0 l1) "hello") (failed 54) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(= s1 "abc")
X		(put_nth 0 l1 s1)
X		(if (!= (nth 0 l1) "abc") (failed 55) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(= s1 "abc")
X		(put_nth 0 l1 s1)
X		(= s1 "123456789")
X		(if (!= (nth 0 l1) "abc") (failed 56) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(declare a57 b57)
X		(= b57 "hello")
X		(= a57 b57)
X		(if (!= a57 "hello") (failed 57) (passed))
X		;;;;;;;;;;;;;;;;;;;;;;
X		(message "Tests passed: %d, failed: %d" num_passed num_failed)
X	)
X)
X(macro passed
X	(
X		(++ num_passed)
X	)
X)
X(macro failed
X	(
X		(int	num)
X		(string	buf)
X
X		(get_parm 0 num)
X		(sprintf buf "Test %d:  Failed.\n" num)
X		(insert buf)
X		(++ num_failed)
X	)
X)
X(macro test1_macro
X	(
X		(string	s1 s2)
X		(int	i1 i2)
X		(get_parm 0 s1)
X		(get_parm 1 i1)
X		(get_parm 2 s2)
X		(get_parm 3 i2)
X		(return (&& (&& (&& (== s1 "literal-string") (== i1 23)) 
X					(== s2 "variable")) (== i2 99)) )
X	)
X) 
X(macro test2_macro
X	(	(string	s1)
X
X
X		(= s1 "variable")
X		(put_parm 0 25)
X		(put_parm 1 26)
X		(put_parm 2 27)
X		(put_parm 3 "literal")
X		(put_parm 4 s1)
X	)
X)
X(macro test3_macro
X	(
X		(returns "XYZZY")
X	)
X)
X(macro test4_macro
X	(	
X		(int	dir re)
X		(string prompt)
X
X		(= dir 0)
X		(= re 1)	
X		(sprintf prompt "%c Pattern%s: " (if dir 25 24 ) (if re "" " (RE off)" ))
X		(return (!= prompt " Pattern: "))
X	)
X)
X(macro test5_macro
X	(
X		(string	s1)
X		(= s1 "XYZ")
X		(returns (if 1 s1 "def"))
X	)
X)
SHAR_EOF
chmod 0444 src/crisp/regress.m || echo "restore of src/crisp/regress.m fails"
mkdir src src/crisp >/dev/null 2>&1
echo "x - extracting src/crisp/sdb.m (Text)"
sed 's/^X//' << 'SHAR_EOF' > src/crisp/sdb.m &&
X/********************************************************************
X *                                                                  *
X *      CRISP - Custom Reduced Instruction Set Programmers Editor   *
X *                                                                  *
X *      (C) Paul Fox, 1989                                          *
X *      43, Jerome Close                Tel: +44 6284 4222          *
X *          Marlow                                                  *
X *           Bucks.                                                 *
X *              England SL7 1TX                                     *
X *                                                                  *
X *                                                                  *
X *    Please See COPYRIGHT notice.                                  *
X *                                                                  *
X ********************************************************************/
X(macro sdb
X	(
X		(sdb_display_file "main.c" 15)
X	)
X)
X(macro sdb_display_file
X	(
X		(int	sdb_buffer sdb_file_window)
X		(int	line lines current_buffer current_window)
X		(string	file sdb_file)
X		(global	sdb_file sdb_buffer sdb_file_window)
X
X		(get_parm 0 file)
X		(get_parm 1 line)
X
X		(= current_buffer (inq_buffer))
X		(= current_window (inq_window))
X
X		(if (== sdb_file_window 0) (
X				(create_edge 2)
X				(= sdb_file_window (inq_window))
X				)
X		;else
X				(set_window sdb_file_window)
X		)
X
X		(if sdb_buffer
X				(set_buffer	sdb_buffer)
X				(= sdb_buffer (create_buffer "Sdb File" file 1))
X				)
X
X		(attach_buffer sdb_buffer)
X		(goto_old_line line)
X		(inq_window_size lines)
X		(set_top_left (- line (/ lines 2)))
X		(insert "==> ")
X
X		(set_window current_window)
X	)
X)
SHAR_EOF
chmod 0444 src/crisp/sdb.m || echo "restore of src/crisp/sdb.m fails"
mkdir src src/crisp >/dev/null 2>&1
echo "x - extracting src/crisp/search.m (Text)"
sed 's/^X//' << 'SHAR_EOF' > src/crisp/search.m &&
X/********************************************************************
X *                                                                  *
X *      CRISP - Custom Reduced Instruction Set Programmers Editor   *
X *                                                                  *
X *      (C) Paul Fox, 1989                                          *
X *      43, Jerome Close                Tel: +44 6284 4222          *
X *          Marlow                                                  *
X *           Bucks.                                                 *
X *              England SL7 1TX                                     *
X *                                                                  *
X *                                                                  *
X *    Please See COPYRIGHT notice.                                  *
X *                                                                  *
X ********************************************************************/
X# include	"crisp.h"
X
X(macro search-options
X	(
X		(list	r_list s_list)
X		(put_nth 0 r_list search-regexp)
X		(put_nth 1 r_list search-case)
X		(put_nth 2 r_list search-block)
X		(put_nth 3 r_list search-syntax)
X		(= s_list (quote_list
X			"Regular Expressions   : "	("No" "Yes")
X			"Case sensitive        : " ("No" "Yes")
X			"Block selection       : " ("Off" "On")
X			"Syntax mode           : " ("CRISP" "Unix")
X			))
X		(= r_list (field_list "Search Parameters" r_list s_list))
X		(= search-regexp (nth 0 r_list))
X		(= search-case (nth 1 r_list))
X		(= search-block (nth 2 r_list))
X		(= search-syntax (nth 3 r_list))
X	)
X)
X(macro translate-fwd
X	(
X		(int	old_msg_level)
X
X		(if (<= (get_parm NULL translate-pattern "Translate: " NULL translate-pattern) 0)
X			(return))
X		(if (<= (get_parm NULL translate-replacement "Replacement: " NULL translate-replacement) 0)
X			(return))
X		(= old_msg_level (inq_msg_level))
X		(set_msg_level 0)
X		(translate translate-pattern translate-replacement NULL 
X				search-regexp search-case search-block)
X		(set_msg_level old_msg_level)
X	)
X)
X(macro search-fwd
X	(
X		(int	old_msg_level
X				match_len)
X		
X		(if (<= (get_parm NULL search-pattern "Search for: " NULL search-pattern) 0)
X			(return))
X		(= old_msg_level (inq_msg_level))
X		(set_msg_level 0)
X		(= match_len (search_fwd search-pattern search-regexp search-case search-block))
X		(set_msg_level old_msg_level)
X		(return (search-hilite match_len))
X	)
X)
X(macro search-back
X	(
X		(int	old_msg_level
X				match_len)
X
X		(if (<= (get_parm NULL search-pattern "Search back: " NULL search-pattern) 0)
X			(return))
X		(= old_msg_level (inq_msg_level))
X		(set_msg_level 0)
X		(= match_len (search_back search-pattern search-regexp search-case search-block))
X		(set_msg_level old_msg_level)
X		(return (search-hilite match_len))
X	)
X)
X
X(macro search_next
X	(
X		(int	old_msg_level
X				match_len)
X
X		(save_position)
X		(next_char)
X		(= old_msg_level (inq_msg_level))
X		(set_msg_level 0)
X
X		(= match_len (search_fwd search-pattern search-regexp search-case search-block))
X		(if (<= match_len 0)
X			(restore_position)
X		;else
X			(restore_position 0))
X
X		(set_msg_level old_msg_level)
X		(return (search-hilite match_len))
X	)
X)
X(macro search_prev
X	(
X		(int	old_msg_level
X				match_len)
X
X		(save_position)
X		(prev_char)
X		(= old_msg_level (inq_msg_level))
X		(set_msg_level 0)
X
X		(= match_len (search_back search-pattern search-regexp search-case search-block))
X		(if (<= match_len 0)
X			(restore_position)
X		;else
X			(restore_position 0))
X
X		(set_msg_level old_msg_level)
X		(return (search-hilite match_len))
X	)
X)
X
X/*************************************************************
X/*   Macro to hilite a group of characters until a key is
X/*   pressed. Used by search-fwd and search-back macros.
X/*************************************************************/
X(macro search-hilite
X	(
X		(int	ch)
X		(int	match_len)
X		
X		(get_parm 0 match_len)
X		
X		(if (<= match_len 2)
X			(return match_len))
X
X		/*----------------------------------------
X		/*   If search is successful, hilite the
X		/*   matched string but only if the matched
X		/*   string len is at least 2 chars wide,
X		/*   otherwise we have real problems on
X		/*   a mono screen. We hilite the
X		/*   string until the user presses another
X		/*   key.
X		/*----------------------------------------*/
X		(next_char (- match_len 1))
X		(drop_anchor MK_NONINC)
X		(prev_char (- match_len 1))
X		(refresh)
X		(while (== (= ch (read_char)) -1)
X			)
X		(push_back ch)
X		(raise_anchor)
X		(return match_len)
X	)
X)
X(macro _init
X	(
X		(int		search-regexp
X					search-case
X					search-block
X					search-syntax
X					)
X		(string	search-pattern
X					translate-pattern
X					translate-replacement)
X		(global	search-regexp
X					search-case
X					search-block
X					search-pattern
X					search-syntax
X					translate-pattern
X					translate-replacement)
X
X		(= search-regexp TRUE)
X		(= search-case TRUE)
X		(= search-block FALSE)
X		(= search-syntax 0)	/* Set to 1 for Unix syntax. */
X	)
X)
X
SHAR_EOF
chmod 0444 src/crisp/search.m || echo "restore of src/crisp/search.m fails"
mkdir src src/crisp >/dev/null 2>&1
echo "x - extracting src/crisp/select.m (Text)"
sed 's/^X//' << 'SHAR_EOF' > src/crisp/select.m &&
X/********************************************************************
X *                                                                  *
X *      CRISP - Custom Reduced Instruction Set Programmers Editor   *
X *                                                                  *
X *      (C) Paul Fox, 1989                                          *
X *      43, Jerome Close                Tel: +44 6284 4222          *
X *          Marlow                                                  *
X *           Bucks.                                                 *
X *              England SL7 1TX                                     *
X *                                                                  *
X *                                                                  *
X *    Please See COPYRIGHT notice.                                  *
X *                                                                  *
X ********************************************************************/
X# include	"crisp.h"
X
X# define TRUE	1
X# define FALSE	0
X# define	TOP_LINE			3
X# define	WINDOW_OFFSET	6
X# define	MARGIN			12
X
X(macro _init
X	(
X		(int		top_line 
X					window_offset 
X					select_nest_level)
X		(global 	top_line 
X					window_offset
X					select_nest_level)
X
X		(= top_line TOP_LINE)
X		(= window_offset WINDOW_OFFSET)
X	)
X)
X;*
X;*  Display list of buffers on screen, and allow user to make a selection.
X;*
X;*  First parameter says whether to display in long or short format.
X;*  Short format is compatible with the BRIEF display; Long mode is
X;*  adds extra status fields, demonstrating CRISP's enhancements.
X;*
X;*  Second parameter says whether to display system buffers as well.
X;*
X(macro buffer_list
X	(
X		(int	curbuf
X				curwin)
X		(int	shortmode)
X		(int	sysbuffers)
X		(int	buf_no)
X		(int	buffer_list)
X		(int	win)
X		(int	retval)
X		(int	this_buf)
X		(int	position)
X		(string	file_name)
X		(string	tmp line modes)
X
X		(get_parm 0 shortmode)
X		(get_parm 1 sysbuffers)
X
X		(= shortmode (! shortmode))
X
X		(= curbuf (inq_buffer))
X		(= buffer_list (create_buffer "Buffer List" NULL 1))
X		(set_buffer buffer_list)
X
X		(= buf_no 1)
X		(set_buffer curbuf)
X		(set_buffer (next_buffer))
X		(while (1) (
X			(inq_names file_name)
X			(= this_buf (inq_buffer))
X			(if (|| sysbuffers (! (inq_system))) (
X				(if shortmode
X	 				(sprintf tmp "%d) %s%s\n" 
X								buf_no 
X								file_name 
X								(if (inq_modified) "*" ""))
X				;else
X					(
X					(inq_position position)
X					(= modes "")
X					(+= modes (if (& (inq_buffer_flags) BF_CHANGED) "*" " "))
X					(+= modes (if (& (inq_buffer_flags) BF_PROCESS) "P" " "))
X					(+= modes (if (& (inq_buffer_flags) BF_BACKUP) "B" " "))
X					(+= modes (if (& (inq_buffer_flags) BF_READONLY) "R" " "))
X					(+= modes (if (inq_system) "S" " "))
X					(+= modes (if (& (inq_buffer_flags) BF_BINARY) " <Bin> " "       "))
X	 				(sprintf tmp "%d)  %5d %5d %s %s" 
X								buf_no 
X								(inq_lines) 
X								position
X								modes
X								file_name)
X					)
X				)
X				(set_buffer buffer_list)
X				(if (> buf_no 1)
X					(insert "\n"))
X				(insert tmp)
X				(++ buf_no)
X				(set_buffer this_buf)
X				))
X			(if (== (inq_buffer) curbuf)
X				(break))
X			(set_buffer (next_buffer sysbuffers))
X			))
X
X		(message "List created.")
X
X		(= win (sized_window buf_no 70 "<Up>, <Down> to move. <Enter> to select, D to delete, W to write"))
X		(= retval (select_buffer buffer_list win SEL_NORMAL
X				(
X					(assign_to_key "d"	"buf_delete")
X					(assign_to_key "D"	"buf_delete")
X					(assign_to_key "w"	"buf_write")
X					(assign_to_key "W"	"buf_write")
X				)
X				NULL
X				"help_display \"features/Buflist.hlp\" \"List Buffers\""
X			))
X
X		(if (< retval 0) (
X			(delete_buffer buffer_list)
X			(set_buffer curbuf)
X			(attach_buffer curbuf)
X			(return)
X			))
X
X		(set_buffer buffer_list)
X		(move_abs retval 0)
X		(= line (trim (read)))
X		(delete_buffer buffer_list)
X		(set_buffer curbuf)
X
X		(= line (substr line (+ (rindex line " ") 1)))
X		(if (== (substr line (strlen line)) "*")
X			(= line (substr line (- (strlen line) 1))))
X		(edit_file line)
X	)
X)
X(macro buf_delete
X	(
X		(string line str)
X		(int		buf)
X
X		(= line (trim (read)))
X		(= line (substr line (+ (rindex line " ") 1)))
X		(if (== (substr line (strlen line)) "*")
X			(= line (substr line (- (strlen line) 1))))
X
X		(= buf (inq_file_buffer line))
X		;*
X		;*   Dont let user delete a buffer which is currently
X		;*   being displayed.
X		;*
X		(if (inq_views buf) (
X			(error "Cannot delete a buffer being displayed.")
X			(return)))
X		;*
X		;*   If buffer has been modified, check whether user
X		;*   is really sure.
X		;*
X		(if (inq_modified buf) (
X			(= str "X")
X			(while (&& (!= str "y") (!= str "Y")) (
X				(if (! (get_parm NULL str "Buffer has not been saved. Delete [ynw]? " 1))
X					(= str "n"))
X				(if (|| (== str "n") (== str "N")) (
X					(message "")
X					(return)
X					))
X				(if (|| (== str "w") (== str "W")) (
X					(int curbuf)
X					(= curbuf (inq_buffer))
X					(set_buffer buf)
X					(write_buffer)
X					(set_buffer curbuf)
X					(break)
X					))
X				))
X			))
X		(delete_buffer buf)
X		(delete_line)
X	)
X)
X(macro buf_write
X	(
X		(string line str)
X		(int		curbuf buf)
X
X		(= line (trim (read)))
X		(= line (substr line (+ (rindex line " ") 1)))
X		(if (== (substr line (strlen line)) "*")
X			(= line (substr line (- (strlen line) 1))))
X
X		(= buf (inq_file_buffer line))
X		(if (! (inq_modified buf)) (
X			(error "Buffer already saved.")
X			(return)
X			))
X		(= curbuf (inq_buffer))
X		(set_buffer buf)
X		(write_buffer)
X		(set_buffer curbuf)
X		(translate "*" " " 0 0)
X		(beginning_of_line)
X		(message "Buffer saved.")
X	)
X)
X(macro select_file
X	(
X		(string file path cwd wild_card title)
X		(int i)
X
X		(getwd NULL cwd)
X		(get_parm 0 wild_card)
X		(get_parm 1 title)
X		(if (== wild_card "")
X			(= wild_card "*")
X		;
X			(+= wild_card "*")
X			)
X		(if (= i (rindex wild_card "/")) (
X			(= path (substr wild_card 1 (- i 1)))
X			(cd path)
X			))
X		(while 1 (
X			(getwd NULL path)
X			(= file (_select_file path wild_card title))
X			(if (== file "")
X				(break))
X			(if (!= (substr file (strlen file)) "/")
X				(break))
X			(cd file)
X			(= wild_card "*")
X			))
X		(refresh)
X		(cd cwd)
X		(return (+ path (+ "/" file)))
X	)
X)
X(macro _select_file
X	(
X		(string	name	
X					file
X					path
X					wild-card
X					nl
X					title
X					tmpbuf)
X		(int		size
X					ret
X					mtime
X					mode
X					curbuf
X					width
X					min_width
X					i
X					buf
X					win)
X
X		(= curbuf (inq_buffer))
X		(get_parm 0 path)
X		(= min_width (+ (strlen path) 6))
X		(get_parm 2 title)
X		(= buf (create_buffer (if (!= title "") title path) NULL 1))
SHAR_EOF
echo "End of part 4"
echo "File src/crisp/select.m is continued in part 5"
echo "5" > s2_seq_.tmp
exit 0
-- 
=====================			Reuters Ltd PLC, 
Tel: +44 628 891313 x. 212		 Westthorpe House,
UUCP:     fox%marlow.uucp@idec.stc.co.uk  Little Marlow,
					   Bucks, England SL7 3RQ