4 source/highlightData.c | 2 -
5 source/macro.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++
6 3 files changed, 98 insertions(+), 1 deletion(-)
8 diff --quilt old/source/macro.c new/source/macro.c
10 +++ new/source/macro.c
11 @@ -422,10 +422,12 @@ static int evalMS(WindowInfo *window, Da
12 int nArgs, DataValue *result, char **errMsg);
13 static int callFuncMS(WindowInfo *window, DataValue *argList,
14 int nArgs, DataValue *result, char **errMsg);
15 static int callFuncWithArgsMS(WindowInfo *window, DataValue *argList,
16 int nArgs, DataValue *result, char **errMsg);
17 +static int defineFuncMS(WindowInfo *window, DataValue *argList,
18 + int nArgs, DataValue *result, char **errMsg);
20 /* Pattern Match Feature */
21 static int getMatchingMS(WindowInfo *window, DataValue *argList, int nArgs,
22 DataValue *result, char **errMsg);
24 @@ -522,10 +524,11 @@ static const BuiltInSubrName MacroSubrs[
25 { "to_column", toColumnMS },
26 { "set_window_title", setWindowTitleMS },
28 { "call_func", callFuncMS },
29 { "call_func_with_args", callFuncWithArgsMS },
30 + { "define_func", defineFuncMS },
31 { NULL, NULL } /* sentinel */
34 static const BuiltInSubrName SpecialVars[] = {
35 { "$cursor", cursorMV },
36 @@ -3975,10 +3978,99 @@ out:
37 XtFree((char *)argListNew);
43 + * define_func(func_name, func_body[, "override"])
45 +static int defineFuncMS(WindowInfo *window, DataValue *argList,
46 + int nArgs, DataValue *result, char **errMsg)
48 + char stringStorage[3][TYPE_INT_STR_SIZE(int)];
51 + char *bodysave = NULL;
52 + char *stoppedAt = NULL;
54 + char *override = NULL;
59 + if (nArgs < 2 || nArgs > 3) {
60 + return wrongNArgsErr(errMsg);
62 + if (!readStringArg(argList[0], &name, stringStorage[0], errMsg)) {
65 + if (!readStringArg(argList[1], &body, stringStorage[1], errMsg)) {
69 + if (!readStringArg(argList[2], &override, stringStorage[2], errMsg)) {
72 + if (strcmp(override, "override")) {
73 + *errMsg = "Unknown parameter for subroutine %s";
78 + /* check function name */
79 + if (strlen(name) >= MAX_SYM_LEN) {
80 + *errMsg = "subroutine name too long";
84 + while (isalnum((unsigned char)*namePtr) || *namePtr == '_')
87 + *errMsg = "subroutine name is not a valid identifier";
91 + /* add a terminating newline (which command line users are likely to
92 + omit since they are typically invoking a single routine) */
93 + bodysave = XtMalloc(strlen(body) + 2);
95 + *errMsg = "Internal error";
98 + strcpy(bodysave, body);
99 + strcat(bodysave, "\n");
101 + /* Parse the macro and report errors if it fails */
102 + prog = ParseMacro(bodysave, errMsg, &stoppedAt);
104 + ParseError(window->shell, bodysave, stoppedAt, name, *errMsg);
110 + sym = LookupSymbol(name);
113 + *errMsg = "Try to override existing function.";
116 + if (sym->type == MACRO_FUNCTION_SYM)
117 + FreeProgram(sym->value.val.prog);
119 + sym->type = MACRO_FUNCTION_SYM;
120 + sym->value.val.prog = prog;
123 + subrPtr.val.prog = prog;
124 + subrPtr.tag = NO_TAG;
125 + sym = InstallSymbol(name, MACRO_FUNCTION_SYM, subrPtr);
132 static int listDialogMS(WindowInfo *window, DataValue *argList, int nArgs,
133 DataValue *result, char **errMsg)
135 macroCmdInfo *cmdData;
136 diff --quilt old/source/highlightData.c new/source/highlightData.c
137 --- old/source/highlightData.c
138 +++ new/source/highlightData.c
139 @@ -549,11 +549,11 @@ static char *DefaultPatternSets[] = {
140 README:\"NEdit Macro syntax highlighting patterns, version 2.6, maintainer Thorsten Haude, nedit at thorstenhau.de\":::Flag::D\n\
141 Comment:\"#\":\"$\"::Comment::\n\
142 Built-in Misc Vars:\"(?<!\\Y)\\$(?:active_pane|args|calltip_ID|column|cursor|display_width|empty_array|file_name|file_path|language_mode|line|locked|max_font_width|min_font_width|modified|n_display_lines|n_panes|rangeset_list|read_only|selection_(?:start|end|left|right)|server_name|text_length|top_line|transient|VERSION|NEDIT_HOME)>\":::Identifier::\n\
143 Built-in Pref Vars:\"(?<!\\Y)\\$(?:auto_indent|em_tab_dist|file_format|font_name|font_name_bold|font_name_bold_italic|font_name_italic|highlight_syntax|incremental_backup|incremental_search_line|make_backup_copy|match_syntax_based|overtype_mode|show_line_numbers|show_matching|statistics_line|tab_dist|use_tabs|wrap_margin|wrap_text)>\":::Identifier2::\n\
144 Built-in Special Vars:\"(?<!\\Y)\\$(?:[1-9]|list_dialog_button|n_args|read_status|search_end|shell_cmd_status|string_dialog_button|sub_sep)>\":::String1::\n\
145 - Built-in Subrs:\"<(?:append_file|beep|calltip|call_func(?:_with_args)?|clipboard_to_string|dialog|filename_dialog|dict_(?:insert|complete|save|append|is_element)|eval|focus_window|get_character|get_pattern_(by_name|at_pos)|get_range|get_selection|get_style_(by_name|at_pos)|getenv|highlight_calltip_line|kill_calltip|length|list_dialog|max|min|rangeset_(?:add|create|destroy|get_by_name|includes|info|invert|range|set_color|set_mode|set_name|subtract)|read_file|replace_in_string|replace_range|replace_selection|replace_substring|search|search_string|select|select_rectangle|set_cursor_pos|get_matching|set_transient|set_window_title|shell_command|split|string_compare|string_dialog|string_to_clipboard|substring|t_print|to_(?:column|line|pos)|tolower|toupper|typeof|valid_number|write_file)(?=\\s*\\()\":::Subroutine::\n\
146 + Built-in Subrs:\"<(?:append_file|beep|calltip|call_func(?:_with_args)?|clipboard_to_string|define_func|dialog|filename_dialog|dict_(?:insert|complete|save|append|is_element)|eval|focus_window|get_character|get_pattern_(by_name|at_pos)|get_range|get_selection|get_style_(by_name|at_pos)|getenv|highlight_calltip_line|kill_calltip|length|list_dialog|max|min|rangeset_(?:add|create|destroy|get_by_name|includes|info|invert|range|set_color|set_mode|set_name|subtract)|read_file|replace_in_string|replace_range|replace_selection|replace_substring|search|search_string|select|select_rectangle|set_cursor_pos|get_matching|set_transient|set_window_title|shell_command|split|string_compare|string_dialog|string_to_clipboard|substring|t_print|to_(?:column|line|pos)|tolower|toupper|typeof|valid_number|write_file)(?=\\s*\\()\":::Subroutine::\n\
147 Menu Actions:\"<(?:new(?:_tab|_opposite)?|open|open-dialog|open_dialog|open-selected|open_selected|close|save|save-as|save_as|save-as-dialog|save_as_dialog|revert-to-saved|revert_to_saved|revert_to_saved_dialog|include-file|include_file|include-file-dialog|include_file_dialog|load-macro-file|load_macro_file|load-macro-file-dialog|load_macro_file_dialog|load-tags-file|load_tags_file|load-tags-file-dialog|load_tags_file_dialog|unload_tags_file|load_tips_file|load_tips_file_dialog|unload_tips_file|print|print-selection|print_selection|exit|undo|redo|delete|select-all|select_all|shift-left|shift_left|shift-left-by-tab|shift_left_by_tab|shift-right|shift_right|shift-right-by-tab|shift_right_by_tab|find|find-dialog|find_dialog|find-again|find_again|find-selection|find_selection|find_incremental|start_incremental_find|replace|replace-dialog|replace_dialog|replace-all|replace_all|replace-in-selection|replace_in_selection|replace-again|replace_again|replace_find|replace_find_same|replace_find_again|goto-line-number|goto_line_number|goto-line-number-dialog|goto_line_number_dialog|goto-selected|goto_selected|mark|mark-dialog|mark_dialog|goto-mark|goto_mark|goto-mark-dialog|goto_mark_dialog|match|select_to_matching|goto_matching|find-definition|find_definition|show_tip|split-pane|split_pane|close-pane|close_pane|detach_document(?:_dialog)?|move_document_dialog|(?:next|previous|last)_document|uppercase|lowercase|fill-paragraph|fill_paragraph|control-code-dialog|control_code_dialog|filter-selection-dialog|filter_selection_dialog|filter-selection|filter_selection|execute-command|execute_command|execute-command-dialog|execute_command_dialog|execute-command-line|execute_command_line|shell-menu-command|shell_menu_command|macro-menu-command|macro_menu_command|bg_menu_command|post_window_bg_menu|post_tab_context_menu|beginning-of-selection|beginning_of_selection|end-of-selection|end_of_selection|repeat_macro|repeat_dialog|raise_window|focus_pane|set_statistics_line|set_incremental_search_line|set_show_line_numbers|set_auto_indent|set_wrap_text|set_wrap_margin|set_highlight_syntax|set_make_backup_copy|set_incremental_backup|set_show_matching|set_match_syntax_based|set_overtype_mode|set_locked|set_tab_dist|set_em_tab_dist|set_use_tabs|set_fonts|set_language_mode)(?=\\s*\\()\":::Subroutine::\n\
148 Text Actions:\"<(?:self-insert|self_insert|grab-focus|grab_focus|extend-adjust|extend_adjust|extend-start|extend_start|extend-end|extend_end|secondary-adjust|secondary_adjust|secondary-or-drag-adjust|secondary_or_drag_adjust|secondary-start|secondary_start|secondary-or-drag-start|secondary_or_drag_start|process-bdrag|process_bdrag|move-destination|move_destination|move-to|move_to|move-to-or-end-drag|move_to_or_end_drag|end_drag|copy-to|copy_to|copy-to-or-end-drag|copy_to_or_end_drag|exchange|process-cancel|process_cancel|paste-clipboard|paste_clipboard|copy-clipboard|copy_clipboard|cut-clipboard|cut_clipboard|copy-primary|copy_primary|cut-primary|cut_primary|newline|newline-and-indent|newline_and_indent|newline-no-indent|newline_no_indent|delete-selection|delete_selection|delete-previous-character|delete_previous_character|delete-next-character|delete_next_character|delete-previous-word|delete_previous_word|delete-next-word|delete_next_word|delete-to-start-of-line|delete_to_start_of_line|delete-to-end-of-line|delete_to_end_of_line|forward-character|forward_character|backward-character|backward_character|key-select|key_select|process-up|process_up|process-down|process_down|process-shift-up|process_shift_up|process-shift-down|process_shift_down|process-home|process_home|forward-word|forward_word|backward-word|backward_word|forward-paragraph|forward_paragraph|backward-paragraph|backward_paragraph|beginning-of-line|beginning_of_line|end-of-line|end_of_line|beginning-of-file|beginning_of_file|end-of-file|end_of_file|next-page|next_page|previous-page|previous_page|page-left|page_left|page-right|page_right|toggle-overstrike|toggle_overstrike|scroll-up|scroll_up|scroll-down|scroll_down|scroll_left|scroll_right|scroll-to-line|scroll_to_line|select-all|select_all|select_word|deselect-all|deselect_all|focusIn|focusOut|process-return|process_return|process-tab|process_tab|insert-string|insert_string|mouse_pan)(?=\\s*\\()\":::Subroutine::\n\
149 Macro Hooks:\"<(?:post_open|pre_open|post_save|cursor_moved|modified|focus|losing_focus)_hook(?=\\s*\\()\":::Subroutine1::\n\
150 Keyword:\"<(?:break|continue|define|delete|else|for|if|in|return|while)>\":::Keyword::\n\
151 Braces:\"[{}\\[\\]]\":::Keyword::\n\
152 diff --quilt old/doc/help.etx new/doc/help.etx
155 @@ -2585,10 +2585,15 @@ Macro Subroutines
157 **clipboard_to_string()**
158 Returns the contents of the clipboard as a macro string. Returns empty
161 +**define_func( name, body [, "override"] )**
162 + Defines a new function with name ~name~ and the macro code in ~body~.
163 + If the ~"override"~ option is given the new symbol overrides previously
166 **dialog( message, btn_1_label, btn_2_label, ... )**
167 Pop up a dialog for querying and presenting information to the user. First
168 argument is a string to show in the message area of the dialog.
169 Additional optional arguments represent labels for buttons to appear along
170 the bottom of the dialog. Returns the number of the button pressed (the