allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) (07/23/89)
Posting-number: Volume 7, Issue 39 Submitted-by: fox@marlow.UUCP (Paul Fox) Archive-name: crisp1.9/part19 #!/bin/sh # this is part 5 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # file src/crisp/select.m continued # CurArch=5 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/select.m" sed 's/^X//' << 'SHAR_EOF' >> src/crisp/select.m X (set_buffer buf) X (get_parm 1 wild-card) X (if (|| (== wild-card "") (== wild_card "*")) ( X (insert "../") X (= nl "\n") X (= wild-card "*"))) X (file_pattern wild-card) X X (while (find_file name size mtime mtime mode) ( X (sprintf tmpbuf "%s%s" name (if (& mode S_IFDIR) "/" "")) X (insert nl) X (= nl "\n") X (insert tmpbuf) X )) X (= file "") X (if (== (inq_lines) 0) ( X (beep) X ) X ;else X ( X (= width (inq_line_length)) X (if (< width min_width) X (= width min_width)) X (sort_buffer) X (end_of_buffer) X (insert "\n") X (+= window_offset 20) X (= win (sized_window (inq_lines) width "")) X (-= window_offset 20) X (= ret (select_buffer buf win NULL NULL NULL X "help_display \"features/AbbFiles.hlp\" \"Filename Abbreviations\"" X )) X (if (>= ret 0) ( X (goto_line ret) X (= file (trim (read))) X )) X )) X (delete_buffer buf) X (set_buffer curbuf) X (attach_buffer curbuf) X (return file) X ) X) X/************************************************************* X/* select_editable X/* X/* Allows current buffer to be edited and we return when X/* <Esc> key is hit. X/*************************************************************/ X(macro select_editable X ( X (int old_kbd) X (string old_escape) X X (= old_kbd (inq_keyboard)) X (keyboard_push kbd_normal) X (= old_escape (inq_assignment "<Esc>")) X (assign_to_key "<Esc>" "exit") X (process) X (assign_to_key "<Esc>" old_escape) X (keyboard_pop TRUE) X ) X) X# define SEL_SELECTED 1 ;* Enter/Space typed. X# define SEL_ABORTED 2 ;* Escape typed. X// Usage: X// (select_list title X// message_string X// step X// list X// center X// [help_string] X// ) X// X(macro select_list X ( X (int depth width) X (list l do_list help_list) X (int buffer X old_buffer X i lines X step X win X old_win X center X retval) X (declare option help_var) X (string title X message_string) X (int menu_level) X X (get_parm 0 title) X (get_parm 1 message_string) X (get_parm 2 step) X (get_parm 3 l) X (get_parm 4 center) X (get_parm 5 help_var) X X ;* X ;* Save position so that cursor doesn't move to X ;* the top of the screen when the user has finished X ;* selecting. X ;* X (save_position) X X (= old_buffer (inq_buffer)) X (= buffer (create_buffer title NULL 1)) X (set_buffer buffer) X (= width (+ (strlen title) 4)) X X (= option "") X (while (1) ( X (= option (nth (* step depth) l)) X (if (! (is_string option)) X (break)) X (if (> step 1) ( X (put_nth depth do_list (nth (+ (* step depth) 1) l)) X (if (> step 2) X (put_nth depth help_list (nth (+ (* step depth) 2) l))) X )) X (if (> depth 0) X (insert "\n")) X (insert option) X (++ depth) X )) X X (= width (inq_line_length)) X X (= old_win (inq_window)) X (= win (sized_window (+ (inq_lines) 1) (+ width 2) message_string)) X (+= top_line 2) X (+= window_offset 6) X X (if (! (is_string help_var)) X (= help_var help_list)) X (= retval (select_buffer buffer win center NULL do_list help_var)) X X (-= top_line 2) X (-= window_offset 6) X X (delete_buffer buffer) X (set_buffer old_buffer) X (set_window old_win) X (attach_buffer old_buffer) X X ;* X ;* Restore position -- leaves cursor in same place X ;* on screen as when user entered this macro. X ;* X (restore_position) X X (return retval) X ) X) X;* X;* Macro to select an entry from a buffer (passed as a parameter). X;* The cursor keys and <Home>, <End> allow movement; typing a letter X;* looks for a line which matches the character typed. X;* X;* This macro returns a number indicating the line in the buffer X;* selected, or < 0 to indicate the user pressed <Esc> to abort X;* the selection. X;* X;* (macro select_buffer X;* buf Buffer to make selection from X;* win Window in which to display buffer. X;* [center] If non-zero, center each line in the buffer. X;* key_list List of commands to execute to set up local X;* keyboard definitions. X;* [do_list] Action to perform if item is selected (<Enter>). X;* [help_list] List of macros to call if <Alt-H> typed on menu X;* item. X;* ) X(macro select_buffer X ( X (int old_buf X old_win X buf X number_of_items X selection X center X width X depth X retval) X (list do_list) X (declare key_list help_list) X X (= old_buf (inq_buffer)) X (= old_win (inq_window)) X X (get_parm 0 buf) X (get_parm 1 win) X (get_parm 4 do_list) X (get_parm 5 help_list) X X X (set_window win) X (set_buffer buf) X (attach_buffer buf) X (top_of_buffer) X (= number_of_items (inq_lines)) X X (if (&& (get_parm 2 center) center) ( X (= depth 0) X (= width (inq_line_length)) X (while (<= (++ depth) number_of_items) ( X (insert " " (+ (/ (- width (strlen (read))) 2) 1)) X (down) X (beginning_of_line) X )) X )) X X (top_of_buffer) X (-- number_of_items) X X (keyboard_push) X (keyboard_typeables) X (assign_to_key "<Alt-H>" "select_help") X (assign_to_key "<Home>" (quote_list ( X (raise_anchor) X (move_abs 1 0) X (drop_anchor 3) X ))) X (assign_to_key "<End>" (quote_list ( X (raise_anchor) X (move_abs (inq_lines) 0) X (drop_anchor 3) X (refresh) X (set_bottom_of_window) X ))) X (assign_to_key "<Up>" (quote_list ( X (raise_anchor) X (up) X (drop_anchor 3) X ))) X (assign_to_key "<Down>" (quote_list ( X (int current_item) X X (inq_position current_item) X (if (<= current_item number_of_items) ( X (raise_anchor) X (down) X (drop_anchor 3) X )) X ))) X (assign_to_key "<Esc>" (quote_list ( X (= selection SEL_ABORTED) X (exit) X ))) X (assign_to_key "<Keypad-minus>" (quote_list ( X (= selection SEL_ABORTED) X (exit) X ))) X (assign_to_key "<Alt-P>" "screen_dump") X X (if (length_of_list do_list) ( X (assign_to_key "<Space>" "sel_list") X (assign_to_key "<Enter>" "sel_list") X ) X ;else X ( X (assign_to_key "<Space>" "exit") X (assign_to_key "<Enter>" "exit") X )) X (assign_to_key "<PgUp>" (quote_list ( X (raise_anchor) X (page_up) X (drop_anchor 3) X ))) X (assign_to_key "<PgDn>" (quote_list ( X (int line) X (raise_anchor) X (page_down) X (inq_position line) X (if (> line (inq_lines)) X (goto_line (inq_lines))) X (drop_anchor 3) X ))) X X (drop_anchor 3) X (get_parm 3 key_list) X (++ select_nest_level) X (if (== select_nest_level 1) X (register_macro REG_TYPED "sel_alpha")) X X (process) X (if (== selection SEL_ABORTED) X (= retval -1) X ;else X (inq_position retval) X ) X (if (== select_nest_level 1) X (unregister_macro REG_TYPED "sel_alpha")) X (-- select_nest_level) X (raise_anchor) X (keyboard_pop) X X (delete_window) X (set_window old_win) X (set_buffer old_buf) X (attach_buffer old_buf) X X (return retval) X ) X) X(macro select_help X ( X (int line) X (declare macro_name) X X (inq_position line) X X (if (is_string help_list) X (= macro_name help_list) X ;else X (= macro_name (nth (- line 1) help_list))) X X (if (! (is_string macro_name)) ( X (message "Sorry, no help for this topic.") X (return))) X (+= top_line 2) X (execute_macro macro_name) X (-= top_line 2) X ) X) X(macro sel_alpha X ( X (string char pat) X (int current_item) X X (prev_char) X (= char (read 1)) X (delete_char) X (inq_position current_item) X X (= pat (+ "<[ ]@" char)) X (move_rel 0 1) X (if (|| (|| (search_fwd pat) (search_fwd (upper pat))) X ((top_of_buffer) (|| (search_fwd pat) (search_fwd (upper pat)))) ) ( X (raise_anchor) X (drop_anchor 3) X (move_rel 0 -1) X ) X ;* else X (move_abs current_item 0) X ) X ) X) X(macro sel_list X ( X (int line) X (declare function) X X (inq_position line) X (-- line) X (= function (nth line do_list)) X (if (is_string function) ( X (if (== function "") X (exit) X ;else X (execute_macro function)) X ) X ;else X (select_list "XYZ" "ABC" 1 function)) X ) X) X;* X;* This macro returns a window buffer of a reasonable size for X;* the terminal. This macro takes into account that we may not be X;* running on a plain 80x25, and gives us as many lines as will X;* fit on the screen whilst taking the callers request into account. X;* X;* (macro sized_window X;* lines maximum number of lines wanted. X;* width width of window. X;* msg message to appear on the bottom of the X;* window. X;* ) X(macro sized_window ;; lines width msg X ( X (int curwin) X (int newwin) X (int lines width) X (string msg) X (int screen_lines screen_cols) X (int lx by rx ty) X X (get_parm 0 lines) X (get_parm 1 width) X (get_parm 2 msg) X X X (inq_screen_size screen_lines screen_cols) X (= curwin (inq_window)) X X (if (< width 0) X (= width (- screen_cols MARGIN))) X (= lx (- screen_cols (+ window_offset width))) X (if (< lx 1) X (= lx 1)) X (= rx (+ lx width)) X (-- screen_cols) X (if (> rx screen_cols) X (= rx screen_cols)) X (= ty top_line) X (= by (+ ty lines)) X X (if (> by screen_lines) X (= by (- screen_lines 2))) X X (create_window lx by rx ty msg) X (= newwin (inq_window)) X (set_window curwin) X X (return newwin) X X ) X) X# define TRUE 1 X# define FALSE 0 X X// X// Macro to display a list of items and allow the user to toggle X// the values in the list. The valid values for each item are given X// in a list-of-lists. This is a primitive but useful forms-entry X// macro. X// X// Usage: X// (field_list "title to appear on top of window" X// (list of default values) X// (list of items and values) X// ) X// X// Returns: X// List of integers indicating which options were selected. X// X(macro field_list X ( X (list arg) X (int old_buf X old_win X buf X line X ty) X (list result) X (string title) X (declare option) X X X (= old_buf (inq_buffer)) X (= old_win (inq_window)) X X (get_parm 0 title) X (get_parm 1 result) X (get_parm 2 arg) X X (= buf (create_buffer title NULL 1)) X (set_buffer buf) X X (= line 0) X (while (1) ( X (if (! (field_display arg line)) X (break)) X (++ line) X )) X (++ line) X X (= ty 4) X (create_window 5 (+ ty line) 60 ty "<Up>, <Down> to select. <Esc> to exit.") X (attach_buffer buf) X X (= line 0) X (field_display arg line) X (keyboard_push) X X (assign_to_key "<Esc>" "exit") X (assign_to_key "<Down>" "field_down") X (assign_to_key "<Up>" "field_up") X (assign_to_key "<Space>" "field_space") X (process) X X (keyboard_pop) X (message "") X X (delete_window) X (delete_buffer buf) X (set_buffer old_buf) X (return result) X ) X) X(macro field_down X ( X (++ line) X (field_display arg line) X ) X) X(macro field_up X ( X (if (> line 0) ( X (-- line) X (field_display arg line) X )) X ) X) X(macro field_space X ( X (int l n m) X (declare option) X X (= l line) X (= m (nth l result)) X (= option (nth (+ (* 2 line) 1) arg)) X (if (&& (is_list option) (> (length_of_list option) (+ m 1))) X (put_nth l result (+ m 1)) X ;else X (put_nth l result 0) X ) X (field_display arg l) X ) X) X(macro field_display X ( X (int n ; Index of top-level options. X m) ; Current option selected. X (list arg) X (declare prompt) X (declare option) X X (get_parm 0 arg) X (get_parm 1 n) X (= m (nth n result)) X X (= prompt (nth (* 2 n) arg)) X (if (! (is_string prompt)) X (return FALSE)) X X (raise_anchor) X X (move_abs (+ n 1) 1) X (delete_line) X (insert prompt) X X (save_position) X (= option (nth (+ (* 2 n) 1) arg)) X (if (is_string option) ( X (message "Type in new value of option.") X (insert option))) X (if (is_list option) ( X (message "Press <Space> to select alternate option.") X (insert (nth m option)) X )) X (insert "\n") X (restore_position) X (drop_anchor 4) X (end_of_line) X X (return TRUE) X X ) X) X SHAR_EOF echo "File src/crisp/select.m is complete" chmod 0444 src/crisp/select.m || echo "restore of src/crisp/select.m fails" mkdir src src/crisp >/dev/null 2>&1 echo "x - extracting src/crisp/shell.m (Text)" sed 's/^X//' << 'SHAR_EOF' > src/crisp/shell.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 X# define LINE 0 X# define CHAR 1 X X# define MAX_HISTORY 20 X X# define LOCAL 1 X X(macro _init X ( X (int sh_key_map sh_id) X (string prompt_regexp) X (global sh_key_map sh_id prompt_regexp) X X (keyboard_push) X (keyboard_typeables) X (= sh_key_map (inq_keyboard)) X X (assign_to_key "<Enter>" "sh_send_line") X (assign_to_key "<Backspace>" "sh_backspace") X (assign_to_key "<Ins>" "sh_paste") X (assign_to_key "<Ctrl-N>" "sh_next_cmd") X (assign_to_key "<Ctrl-P>" "sh_prev_cmd") X (keyboard_pop 1) X X (= prompt_regexp "^*[:$#%] @\\c") X ) X) X(macro ksh X (create_shell "/bin/ksh" "Korn-Shell-Buffer" (| PF_ECHO PF_NOINSERT)) X) X(macro sh X (create_shell "/bin/sh" "Shell-Buffer" (| PF_ECHO PF_NOINSERT)) X) X(macro csh X (create_shell "/bin/csh" "Cshell-Buffer" (| PF_ECHO PF_NOINSERT)) X) X(macro create_shell X ( X (string shell_path X tmpbuf X buffer_name X sh_newline /* Newline character for buffer. */ X ) X (int sh_start_line ;* Place where input started. X sh_start_col X sh_end_line ;* Place where input cursor X sh_end_col ;* has got to. X sh_cmd ;* Where to place next command on history X sh_index ;* Index to current command. X sh_flags /* Flags for initial connect to pty. */ X sh_mode X ) X (list sh_history) X (int sh_buf) X X (get_parm 0 shell_path) X (get_parm 1 buffer_name) X (get_parm 2 sh_flags) X X (if (> (++ sh_id) 1) ( X (sprintf tmpbuf "-%d" sh_id) X (+= buffer_name tmpbuf) X )) X X (= sh_buf (create_buffer buffer_name NULL 0)) X (set_buffer sh_buf) X (set_buffer_flags NULL BF_ANSI) X (attach_buffer sh_buf) X (inq_names tmpbuf NULL NULL) X (autosave_disable tmpbuf) X X (make_local_variable X sh_start_line sh_start_col X sh_end_line sh_end_col X sh_mode X sh_index X sh_cmd X sh_history X sh_newline X sh_flags X ) X (= sh_cmd 0) X (= sh_index 0) X (= sh_mode LINE) X (= sh_start_line -1) X /*---------------------------------------- X /* Default newline character is \n but X /* allow calling macro to override it. X /*----------------------------------------*/ X (= sh_newline "\n") X (get_parm 3 sh_newline) X (register_macro REG_TYPED "sh_insert" LOCAL) X (connect sh_flags shell_path) X (use_local_keyboard sh_key_map) X X (return sh_buf) X ) X) X(macro sh_backspace X ( X (int line col) X X (if (== sh_mode CHAR) ( X (insert_process "\x8") X; (self_insert) X (return))) X X (backspace) X ) X) X(macro sh_insert X ( X (int line col) X (string line_buf) X X (if (== sh_mode CHAR) ( X (prev_char) X (insert_process (read 1)) X (if (& sh_flags PF_ECHO) X (next_char) X /* else */ X (delete_char)) X (return))) X X (if (< sh_start_line 0) ( X (inq_position sh_start_line sh_start_col) X (-- sh_start_col) X (return))) X ) X) X(macro sh_char_mode X ( X (connect 0) X (= sh_mode CHAR) X ) X) X(macro sh_line_mode X ( X (connect (| PF_ECHO PF_NOINSERT)) X (= sh_mode LINE) X ) X) X(macro sh_next_cmd X (sh_recall sh_index 1) X) X(macro sh_prev_cmd X (sh_recall sh_index -1) X) X(macro sh_recall X ( X (int n inc) X (declare atom) X X (if (== sh_mode CHAR) ( X (self_insert) X (return))) X X (get_parm 0 n) X (get_parm 1 inc) X (+= n inc) X X (if (< n 0) X (= n (- MAX_HISTORY 1)) X ) X (if (>= n MAX_HISTORY) X (= n 0) X ) X X (= atom (nth n sh_history)) X (if (! (is_string atom)) ( X (= atom "") X (get_parm 0 n) X )) X (if (>= sh_start_line 0) ( X (move_abs sh_start_line sh_start_col) X (delete_to_eol) X )) X X (inq_position sh_start_line sh_start_col) X; (unregister_macro 0 "sh_insert") X (insert atom) X X (= sh_index n) X ) X) X(macro sh_paste X ( X (if (< sh_start_line 0) ( X (inq_position sh_start_line sh_start_col) X; (unregister_macro 0 "sh_insert") X )) X (paste) X (sh_insert) X ) X) X(macro sh_send_line X ( X (string line) X (int l c pl pc) X X (if (== sh_mode CHAR) ( X (end_of_buffer) X (insert "\n") X (inq_position l c) X (set_process_position l c) X (insert_process sh_newline) X (return))) X X ;* X ;* Try and locate where line came from. If on X ;* last line of buffer, then we can believe the X ;* sh_start_col field, otherwise we try and strip X ;* off the possible prompt at the beginning of the X ;* line. X ;* X (inq_process_position pl pc) X (inq_position l c) X (if (== l pl) ( X (move_abs 0 (+ pc 0)) X (= line (read)))) X X (= line (ltrim (trim line))) X X (if (!= line "") ( X (put_nth sh_cmd sh_history line) X (++ sh_cmd) X (if (>= sh_cmd MAX_HISTORY) X (= sh_cmd 0)) X (= sh_index sh_cmd) X )) X X (= sh_start_line -1) X (end_of_buffer) X (insert "\n") X (inq_position l c) X (set_process_position l c) X (insert_process (+ line "\n")) X ) X) X X SHAR_EOF chmod 0444 src/crisp/shell.m || echo "restore of src/crisp/shell.m fails" mkdir src src/crisp >/dev/null 2>&1 echo "x - extracting src/crisp/startup.m (Text)" sed 's/^X//' << 'SHAR_EOF' > src/crisp/startup.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 startup X ( X (autosave) X (autoindent "y") X ) X) SHAR_EOF chmod 0444 src/crisp/startup.m || echo "restore of src/crisp/startup.m fails" mkdir src src/crisp >/dev/null 2>&1 echo "x - extracting src/crisp/stest.m (Text)" sed 's/^X//' << 'SHAR_EOF' > src/crisp/stest.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// This macro file is used to exercise the regular expression X// parser. The macro (search_test) is called with a pattern, a X// string to match and a start and length count. A (string_search) X// is performed and if the results aren't the expected ones, X// we've boobed somewhere. X// X// A start offset of zero means the search should fail. X(macro search X ( X (int passed failed test) X X (= passed 0) X (= failed 0) X (= test 0) X X (search_test "xyz" "xyz" 1 3) X (search_test "x*z" "xyz" 1 3) X (search_test "<x*z" "xyz" 1 3) X (search_test "<x*z" "xyz" 1 3) X (search_test "x?z" "xyz" 1 3) X (search_test "x?a" "xyz" 0 3) X (search_test "xyz>" "xyz" 1 3) X (search_test "x[y]z>" "xyz" 1 3) X (search_test "x[^y]z>" "xyz" 0 3) X (search_test "x[y]+z>" "xyz" 1 3) X (search_test "x[y]@z>" "xyz" 1 3) X (search_test "x{[y]|x}@z>" "xyz" 1 3) X (search_test "x{[y]|x|a}@z>" "xyz" 1 3) X (search_test "x{[y]|x|a+}@z>" "xyz" 1 3) X (search_test "x{[y]|x|{a}+}@z>" "xyz" 1 3) X (search_test "([^)]@)" "(hello)" 1 7) X (search_test "([^)]@*)" "(hello)" 1 7) X (search_test "([^)]+*)" "(hello)" 1 7) X (message "Passed: %d Failed: %d" passed failed) X ) X) X(macro search_test X ( X (string pat str buf) X (int start length s len) X X (get_parm 0 pat) X (get_parm 1 str) X (get_parm 2 start) X (get_parm 3 len) X (= s (search_string pat str length)) X (if (&& (== s 0) (== start 0)) ( X (++ passed) X (return) X )) X (if (|| (!= s start) (!= len length)) ( X (++ failed) X (sprintf buf "Test %d: ('%s' '%s' %d %d)" test pat str start len) X (insert buf) X (sprintf buf "==> (%d %d)\n" s length) X (insert buf) X ) X ;else X (++ passed)) X ) X) SHAR_EOF chmod 0444 src/crisp/stest.m || echo "restore of src/crisp/stest.m fails" mkdir src src/crisp >/dev/null 2>&1 echo "x - extracting src/crisp/tags.m (Text)" sed 's/^X//' << 'SHAR_EOF' > src/crisp/tags.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 tags X (tag) X) X(macro tag X ( X (string function X sstring) X (int tag_buf X old_buf) X X (get_parm 0 function "Function: ") X (= old_buf (inq_buffer)) X (= tag_buf (create_buffer "Tags" "tags" 1)) X (set_buffer tag_buf) X (top_of_buffer) X (sprintf sstring "^%s" function) X (if (search_fwd sstring) X ( X (string line file pattern) X (int i j) X (= line (read)) X (= i (+ (search_string "\t" line) 1) ) X (= j (- (search_string "[?/]" line) 1)) X (= file (substr line i (- j i) )) X (edit_file file) X (top_of_buffer) X (+= j 2) X (= i (- (- (strlen line) j) 1)) X (= pattern (substr line j i)) X (if (<= (search_fwd pattern) 0) X (error "Function not found.") X ) X ) X ;else X ( X (error "Function %s not found." function) X (set_buffer old_buf) X ) X ) X ) X) X(macro tag_function X ( X (string function) X (int i) X X (save_position) X (search_back "<|{[~_A-Za-z0-9]\\c}") X (= function (ltrim (trim (read)))) X (= i (search_string "[~_A-Za-z0-9]" function NULL ST_REGEXP)) X (if (> i 0) X (= function (substr function 1 (- i 1)))) X (restore_position) X (if (== function "") ( X (beep) X (return) X )) X (tag function) X ) X) X(macro mtags X ( X (int curbuf X buf) X (= curbuf (inq_buffer)) X (message "Creating .m tags file.") X (= buf (perform_unix_command "grep '^(macro' *.m | awk '{printf \"%s\t%s\\n\",$2,$0}' | sort" "")) X (set_buffer buf) X (top_of_buffer) X (translate ":" " /^" ST_GLOBAL) X (top_of_buffer) X (translate "$" "$/" ST_GLOBAL) X (write_buffer "tags") X (set_buffer curbuf) X (message "'tags' file created.") X ) X) SHAR_EOF chmod 0444 src/crisp/tags.m || echo "restore of src/crisp/tags.m fails" mkdir src src/crisp >/dev/null 2>&1 echo "x - extracting src/crisp/telnet.m (Text)" sed 's/^X//' << 'SHAR_EOF' > src/crisp/telnet.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 * Macro to allow telnet/rlogin to a host. Very simple minded at * X * the moment. * X ********************************************************************/ X X# include "crisp.h" X X(macro telnet X ( X (string host) X (if (== (get_parm 0 host) 0) X (= host (get_host_entry))) X (if (== host "") X (return)) X (telnet_rlogin "telnet" host) X ) X) X(macro rlogin X ( X (string host) X (if (== (get_parm 0 host) 0) X (= host (get_host_entry))) X X (if (== host "") X (return)) X (telnet_rlogin "rlogin" host) X ) X) X(macro telnet_rlogin X ( X (string prog host cmd) X X (get_parm 0 prog) X (get_parm 1 host) X (create_shell "/bin/sh" (+ host "-Buffer") PF_NOINSERT "\r") X (= cmd (+ prog (+ " " (+ host "\n")))) X (insert cmd) X (insert_process cmd) X (sh_char_mode) X (refresh) X ) X) X/***************************************** X/* Macro to select an entry from the X/* /etc/hosts file. X/*****************************************/ X(macro get_host_entry X ( X (int curbuf X buf X win X line_no X ) X (string host) X X (message "Press <Enter> to select a host.") X (= curbuf (inq_buffer)) X (= buf (create_buffer "Remote Hosts" "/etc/hosts" 1)) X (set_buffer buf) X X /*---------------------------------------- X /* Delete comment lines. X /*----------------------------------------*/ X (top_of_buffer) X (while (> (search_fwd "^#|$") 0) X (delete_line)) X (top_of_buffer) X (translate "^[0-9A-Fa-fxX.]+[ \t]+{[-a-zA-Z0-9.]+}$|{[ \t#]*$}" "\\0" ST_GLOBAL) X (sort_buffer) X (= win (sized_window (inq_lines) 20 "")) X (= line_no (select_buffer buf win NULL NULL NULL "")) X (if (>= line_no 0) X (= host (trim (ltrim (read))))) X X (delete_buffer buf) X (set_buffer curbuf) X (attach_buffer curbuf) X (message "") X (return host) X ) X) SHAR_EOF chmod 0444 src/crisp/telnet.m || echo "restore of src/crisp/telnet.m fails" mkdir src src/crisp >/dev/null 2>&1 echo "x - extracting src/crisp/text.m (Text)" sed 's/^X//' << 'SHAR_EOF' > src/crisp/text.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 (int grep_buf X grep_line_no X spell_buf X spell_line_no) X (string grep_old_file) X (global grep_buf X grep_line_no X grep_old_file X spell_buf X spell_line_no) X X (= grep_buf (create_buffer "GREP-Buffer" NULL 0)) X (= grep_line_no 1) X ) X) X;* X;* Macro to report how many words in current buffer, and X;* display average word length. X;* X(macro wc X ( X (string tmp_file ;* Current buffer contents. X buf) X (int curbuf X tmp_buf X num_words X num_chars) X X (save_position) X X (top_of_buffer) X (drop_anchor MK_LINE) X (end_of_buffer) X X (sprintf tmp_file "/tmp/gr.wc%d" (getpid)) X (write_block tmp_file) X (sprintf buf "wc -wc %s" tmp_file) X (message "Counting number of words...") X (= tmp_buf (perform_unix_command buf "wc-buffer")) X X (= curbuf (inq_buffer)) X (set_buffer tmp_buf) X (end_of_buffer) X (beginning_of_line) X (search_fwd "[0-9]") X (= num_words (atoi (read))) X (search_fwd " \\c[0-9]") X (= num_chars (atoi (read))) X X (message "Words: %d Avg. len: %d" num_words (/ num_chars num_words)) X X (del tmp_file) X X (set_buffer curbuf) X (delete_buffer tmp_buf) X (attach_buffer curbuf) X (restore_position) X ) X) X;* X;* Macro to perform a grep and display buffers at location X;* of matched strings. X;* X(macro grep X ( X (string buf X pattern X msg X files) X (int curbuf X grep_win X num_lines X line X ) X X (= curbuf (inq_buffer)) X X (get_parm 0 pattern "GREP pattern: ") X (= pattern (trim (ltrim pattern))) X (if (== pattern "") X (return)) X (get_parm 1 files "GREP files: ") X X (sprintf buf "grep -n %s %s /dev/null" pattern files) X (message "Locating text...") X (assign_to_key "<Ctrl-N>" "grep_next") X (assign_to_key "<Ctrl-P>" "grep_prev") X (= grep_buf (perform_unix_command buf "GREP-Buffer" grep_buf)) X (message "") X X (set_buffer grep_buf) X (end_of_buffer) X (insert "\n") X (top_of_buffer) X (= num_lines (inq_lines)) X /*---------------------------------------- X /* Dont let autosave and the exit code know X /* we changed the buffer. X /*----------------------------------------*/ X (set_buffer_flags (~ BF_CHANGED)) X (set_buffer curbuf) X X (if (<= num_lines 1) ( X (error "No matching lines found.") X (return))) X X (= msg (+ (key_label "<Alt-E>") " to edit, <Enter> to select, <Esc> to quit.")) X (= grep_win (sized_window num_lines -1 msg)) X X (= grep_line_no (select_buffer grep_buf grep_win NULL X ( X (assign_to_key "<Alt-E>" "grep_edit") X ) X NULL X "help_display \"features/Grep.hlp\" \"Help on Grep Window\"" X )) X (if (< grep_line_no 0) ( X (return))) X X (grep_display) X ) X) X(macro grep_edit X ( X (string answer) X X (raise_anchor) X (while 1 ( X (message "Type <Esc> to terminate translate mode.") X (select_editable) X (= answer (prompt_ync "GREP translate/continue/abort ? " "tca")) X (if (!= answer "c") X (break)) X )) X (if (== answer "t") X (grep_translate)) X X ) X) X(macro prompt_ync X ( X (string msg X responses X answer) X X (get_parm 0 msg) X (get_parm 1 responses) X (= answer "9") X (while (== (index responses answer) 0) ( X (get_parm NULL answer msg 1) X (= answer (lower answer)) X )) X (return answer) X ) X) X(macro grep_translate X ( X (int line X i j X buf X line_no) X (string lbuf X filename) X X (= buf (inq_buffer)) X (top_of_buffer) X (= line 1) X X (while (< line (inq_lines)) ( X (= lbuf (read)) X (= i (index lbuf ":")) X (= filename (substr lbuf 1 (- i 1))) X (= lbuf (substr lbuf (+ i 1))) X (= j (index lbuf ":")) X (= line_no (atoi (substr lbuf 1 (- j 1)))) X (= lbuf (substr lbuf (+ j 1))) X (edit_file filename) X (move_abs line_no 0) X (delete_line) X (insert lbuf) X (message "File='%s' line=%d" filename line_no) X (set_buffer buf) X (++ line) X (down) X )) X (attach_buffer buf) X ) X) X X(macro grep_next X ( X (++ grep_line_no) X (grep_display) X ) X) X(macro grep_prev X ( X (-- grep_line_no) X (grep_display) X ) X) X(macro grep_display X ( X (string pattern X files X text X filename X ) X (int lines X colon X curbuf X line_no X ) X X (= curbuf (inq_buffer)) X (set_buffer grep_buf) X (= lines (inq_lines)) X X (if (|| (< grep_line_no 1) (>= grep_line_no lines)) ( X (= grep_line_no 1) X (message "No more matching lines.") X (return))) X X (move_abs grep_line_no 1) X (= text (read)) X X (= colon (index text ":")) X (= filename (substr text 1 (- colon 1))) X (= line_no (atoi (substr text (+ colon 1)))) X (if (== filename grep_old_file) X (set_buffer curbuf) X ;else X ( X (edit_file filename) X (top_of_buffer) X (= grep_old_file filename) X )) X (move_abs line_no 1) X (message "<Ctrl-P> previous match, <Ctrl-N> next match.") X ) X) X;* X;* Macro to perform spell on the current buffer, and then allow user X;* to move from word to word. X;* X(macro spell X ( X (string tmp_file X buf) X (int curbuf X num_lines) X X (= curbuf (inq_buffer)) X X (top_of_buffer) X (drop_anchor MK_LINE) X (end_of_buffer) X X (sprintf tmp_file "/tmp/gr.sp%d" (getpid)) X (write_block tmp_file) X (sprintf buf "spell -b %s" tmp_file) X (message "Checking for mis-spelled words...") X (= spell_buf (perform_unix_command buf "wc-buffer")) X X (del tmp_file) X X (set_buffer spell_buf) X (end_of_buffer) X (insert "\n") X (top_of_buffer) X (= num_lines (inq_lines)) X (set_buffer curbuf) X X (if (<= num_lines 1) ( X (error "No spelling mistakes.") X (return))) X X (= spell_line_no 0) X X (assign_to_key "<Ctrl-N>" "spell_next") X (assign_to_key "<Ctrl-P>" "spell_prev") X (spell_next) X X ) X) X(macro spell_next X ( X (while (>= (spell_display (+ spell_line_no 1)) 0) X (continue)) X ) X) X(macro spell_prev X ( X (while (>= (spell_display (- spell_line_no 1)) 0) X (continue)) X ) X) X;* X;* macro to display next incorrect word on screen and allow X;* user to type in a correction. X;* X;* macro returns -1 if an error occurs; X;* 0 user doesnt want to correct word X;* 1 user corrected word. X;* X(macro spell_display X ( X (int curbuf X word_no) X (string word X new_word X buf) X X (get_parm 0 word_no) X (if (<= word_no 0) X (= word_no 1)) X X (= curbuf (inq_buffer)) X X // X // Read next word from list. X // X (set_buffer spell_buf) X (goto_line word_no) X (= spell_line_no word_no) X (= word (trim (ltrim (compress (read))))) X (set_buffer curbuf) X X (if (== word "") ( X (message "No further words to correct.") X (return -1))) X X // X // Now get word onto screen and let user decide to translate X // word. X // X (top_of_buffer) X (sprintf buf "Correct '%s': " word) X (message "Searching for '%s'..." word) X (search_fwd word 0) X (drop_anchor MK_NORMAL) X (right (strlen word)) X (set_center_of_window) X (refresh) X X (if (<= (get_parm NULL new_word buf NULL word) 0) ( X (message "<Ctrl-N>/<Ctrl-P> checks next or previous word.") X (left (strlen word)) X (raise_anchor) X (return -1))) X X (message "") X (left (strlen word)) X (raise_anchor) X X (if (|| (== new_word "") (== new_word word)) X (return 0)) X (translate word new_word NULL 0 1) X (return 1) X ) X) SHAR_EOF chmod 0444 src/crisp/text.m || echo "restore of src/crisp/text.m fails" mkdir src src/crisp >/dev/null 2>&1 echo "x - extracting src/crisp/tty.m (Text)" sed 's/^X//' << 'SHAR_EOF' > src/crisp/tty.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;* This is the default terminal description file. It is used if X;* we cannot find a tty-$BTERM.m file to load. X;* X X# include "tty.h" X X(macro _init X ( X ;* X ;* Set characters used for extended graphics support when X ;* drawing windows. X ;* X (set_term_characters X '+' ;* Top left of window. X '+' ;* Top right of window. X '+' ;* Bottom left of window. X '+' ;* Bottom right of window. X '|' ;* Vertical bar for window sides. X '-' ;* Top and bottom horizontal bar for window. X NULL ;* Top join. X NULL ;* Bottom join. X NULL ;* Window 4-way intersection. X NULL ;* Left hand join. X NULL ;* Right hand join. X ) X ;* X ;* Define escape sequences used for special optimisations on X ;* output. X ;* X (set_term_features X NULL ;* Sequence to clear 'n' spaces. X NULL ;* Sequence to print characters with top X ;* bit set. X NULL ;* Insert-mode cursor. X NULL ;* Overwrite-mode cursor. X NULL ;* Insert-mode cursor (on virtual space). X NULL ;* Overwrite-mode cursor (on virtual space). X NULL ;* Print ESCAPE character graphically. X NULL ;* Escape sequence to repeat last character. X FALSE ;* ESC [0m resets color. X FALSE ;* Terminal does not supports color. X ) X ;* X ;* Define keyboard layout for non-ascii characters. X ;* (These can only be used for the console). X ;* X (set_term_keyboard X F1-F12 X (quote_list "\x1BOP" "\x1BOQ" "\x1BOR" "\x1BOS" "\x1BOT" X "\x1BOU" "\x1BOV" "\x1BOW" "\x1BOX" "\x1BOY" X "\x1BOZ" "\x1BO[" ) X X SHIFT-F1-F12 X (quote_list "\x1BOp" "\x1BOq" "\x1BOr" "\x1BOs" "\x1BOt" X "\x1BOu" "\x1BOv" "\x1BOw" "\x1BOx" "\x1BOy" X "\x1BOz" "\x1BO{" ) X CTRL-F1-F12 X (quote_list "\x1BO\x10" "\x1BO\x11" "\x1BO\x12" "\x1BO\x13" "\x1BO\x14" X "\x1BO\x15" "\x1BO\x16" "\x1BO\x17" "\x1BO\x18" "\x1BO\x19" X "\x1BO\x1a" "\x1BO\x1B" ) X X ;* X ;* We map the useful ALT-keys into CTRL-key equivalents, X ;* X ;* X ALT-A-Z X (quote_list "\x01" "\x02" "\x03" "\x04" "\x05" ;* ALT-A..E X "\x06" "\x07" NULL "\x09" "\x0a" ;* ALT-F..J X "\x0b" "\x0c" NULL "\x0e" "\x0f" ;* ALT-K..O X "\x10" "\x11" "\x12" "\x13" "\x14" ;* ALT-P..T X "\x15" NULL "\x17" "\x18" "\x19" ;* ALT-U..Y X "\x1a") X KEYPAD-0-9 X (quote_list "\x1B[@" "\x1B[Y" "\x1B[B" "\x1B[U" "\x1B[D" X "\x1B[G" "\x1B[C" "\x1B[H" "\x1B[A" "\x1B[V") X CTRL-KEYPAD-0-9 X (quote_list "\x1B?0" "\x1B?1" "\x1B?2" "\x1B?3" "\x1B?4" X "\x1B?5" "\x1B?6" "\x1B?7" "\x1B?8" "\x1B?9") X ALT-0-9 X (quote_list "\x1BN0" "\x1BN1" "\x1BN2" "\x1BN3" "\x1BN4" X "\x1BN5" "\x1BN6" "\x1BN7" "\x1BN8" "\x1BN9") X CUT "\x1B[S" X COPY "\x1B[T" X BACK-TAB "\x1B[Z" X ) X ;* X ;* Following are useful ways to access the BRIEF default CTRL-keys. X ;* (We cant do these direct because we substituted the ALT-keys X ;* above). X (assign_to_key "^V^B" "to_bottom") X (assign_to_key "^V^C" "center_line") X (assign_to_key "^V^D" "screen_down") X (assign_to_key "^V^G" "macros") X (assign_to_key "^V^H" "help") X (assign_to_key "^V^J" "goto_bookmark") X (assign_to_key "^V^K" "delete_previous_word") X (assign_to_key "^V^L" "delete_next_word") X (assign_to_key "^V^N" "next_error") X (assign_to_key "^V^P" "next_error 1") X (assign_to_key "^V^R" "repeat") X (assign_to_key "^V^T" "to_top") X (assign_to_key "^V^U" "screen_up") X (assign_to_key "^V^V" "version") X (assign_to_key "^V^W" "set_backup") X ) X) SHAR_EOF chmod 0444 src/crisp/tty.m || echo "restore of src/crisp/tty.m fails" mkdir src src/crisp >/dev/null 2>&1 echo "x - extracting src/crisp/unix.m (Text)" sed 's/^X//' << 'SHAR_EOF' > src/crisp/unix.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 to execute a unix command and read the output into X * a buffer. The allocated buffer is returned. X * X * (perform_unix_command X * cmd - Unix command to execute. X * header - Header to display at top of window. X * [buf] - If specified name of existing buffer to X * apply command to otherwise, create a new one. X * ) X **************************************************************/ X(macro perform_unix_command X ( X (string cmd X header X file X bufnam X ) X (int tmp_buf curbuf) X X (get_parm 0 cmd) X (get_parm 1 header) X X (= curbuf (inq_buffer)) X (sprintf file "/tmp/GR.%d" (getpid)) X X (shell (+ cmd (+ ">" file)) 1) X X (if (> (get_parm 2 tmp_buf) 0) ( X (set_buffer tmp_buf) X (clear_buffer) X (read_file file) X (top_of_buffer) X (set_buffer curbuf)) X ;else X (= tmp_buf (create_buffer header file 1))) X (del file) X (set_buffer curbuf) X (return tmp_buf) X ) X) X SHAR_EOF chmod 0644 src/crisp/unix.m || echo "restore of src/crisp/unix.m fails" mkdir src src/crisp >/dev/null 2>&1 echo "x - extracting src/crisp/welcome.m (Text)" sed 's/^X//' << 'SHAR_EOF' > src/crisp/welcome.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;* Macro to display latest news information. X;* X# define WELCOME 3 X X(macro welcome X ( X (string space line tmp) X (int old_buf) X (int buf) X X (= old_buf (inq_buffer)) X (edit_file "~/.crisp") X (= buf (inq_buffer)) X (= line (read)) X (if (|| (== line "") X (< (atoi line) WELCOME)) ( X (int buf1) X (edit_file "/usr/local/crisp/src/crisp/welcome.h") X (= buf1 (inq_buffer)) X (refresh) X (get_parm NULL space "Press any key to continue." 1) X (delete_buffer buf1) X (set_buffer buf1) X (delete_line) X (sprintf tmp "%d\n" WELCOME) X (insert tmp) X (write_buffer) X )) X (delete_buffer buf) X (set_buffer old_buf) X ) X) SHAR_EOF chmod 0444 src/crisp/welcome.m || echo "restore of src/crisp/welcome.m fails" mkdir src src/crisp >/dev/null 2>&1 echo "x - extracting src/crisp/window.m (Text)" sed 's/^X//' << 'SHAR_EOF' > src/crisp/window.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;* CRISP - Good Riddance to Interactive Editing Facilities X;* X;* (C) Paul Fox, 1988 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;* File containing various utility routines for manipulating X;* windows. X;**************************************************************/ X X;* X;* Macro to move current line to top of window. X;* X(macro set_top_of_window X ( X (int cur_line) X (inq_position cur_line) X X (set_top_left cur_line) X ) X) X;* X;* Macro to move current line to bottom of window if its X;* possible. If buffer size < size of window, then we make X;* first line of buffer at top of window. X;* X(macro set_bottom_of_window X ( X (int cur_line) X (inq_position cur_line) X X (if (<= (inq_lines) (inq_window_size)) X (set_top_left 1) X ;else X (set_top_left (+ (- cur_line (inq_window_size)) 1)) X ) X ) X) X;* X;* Macro to move current line to center of window (if possible). X;* X(macro set_center_of_window X ( X (int cur_line) X X (inq_position cur_line) X (set_top_left (- cur_line (/ (inq_window_size) 2))) X ) X) X SHAR_EOF chmod 0444 src/crisp/window.m || echo "restore of src/crisp/window.m fails" mkdir src src/crisp >/dev/null 2>&1 echo "x - extracting src/crisp/wp.m (Text)" sed 's/^X//' << 'SHAR_EOF' > src/crisp/wp.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 ********************************************************************/ SHAR_EOF echo "End of part 5" echo "File src/crisp/wp.m is continued in part 6" echo "6" > 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