push up calltip_ignore_arg.patch
[nedit-bw.git] / define_func_macro.patch
blob0982c9a30b2b862387f576f668f9a132941a8bd0
1 ---
3 doc/help.etx | 5 ++
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
9 --- old/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 },
27 { "eval", evalMS },
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);
39 return ret;
42 +/*
43 + * define_func(func_name, func_body[, "override"])
44 + */
45 +static int defineFuncMS(WindowInfo *window, DataValue *argList,
46 + int nArgs, DataValue *result, char **errMsg)
48 + char stringStorage[3][TYPE_INT_STR_SIZE(int)];
49 + char *name = NULL;
50 + char *body = NULL;
51 + char *bodysave = NULL;
52 + char *stoppedAt = NULL;
53 + char *namePtr;
54 + char *override = NULL;
55 + Program *prog;
56 + Symbol *sym;
57 + DataValue subrPtr;
59 + if (nArgs < 2 || nArgs > 3) {
60 + return wrongNArgsErr(errMsg);
61 + }
62 + if (!readStringArg(argList[0], &name, stringStorage[0], errMsg)) {
63 + return False;
64 + }
65 + if (!readStringArg(argList[1], &body, stringStorage[1], errMsg)) {
66 + return False;
67 + }
68 + if (nArgs > 2) {
69 + if (!readStringArg(argList[2], &override, stringStorage[2], errMsg)) {
70 + return False;
71 + }
72 + if (strcmp(override, "override")) {
73 + *errMsg = "Unknown parameter for subroutine %s";
74 + return False;
75 + }
76 + }
78 + /* check function name */
79 + if (strlen(name) >= MAX_SYM_LEN) {
80 + *errMsg = "subroutine name too long";
81 + return False;
82 + }
83 + namePtr = name;
84 + while (isalnum((unsigned char)*namePtr) || *namePtr == '_')
85 + namePtr++;
86 + if (*namePtr) {
87 + *errMsg = "subroutine name is not a valid identifier";
88 + return False;
89 + }
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);
94 + if (!bodysave) {
95 + *errMsg = "Internal error";
96 + return False;
97 + }
98 + strcpy(bodysave, body);
99 + strcat(bodysave, "\n");
101 + /* Parse the macro and report errors if it fails */
102 + prog = ParseMacro(bodysave, errMsg, &stoppedAt);
103 + if (!prog) {
104 + ParseError(window->shell, bodysave, stoppedAt, name, *errMsg);
105 + XtFree(bodysave);
106 + return False;
108 + XtFree(bodysave);
110 + sym = LookupSymbol(name);
111 + if (sym) {
112 + if (!override) {
113 + *errMsg = "Try to override existing function.";
114 + return False;
115 + } else {
116 + if (sym->type == MACRO_FUNCTION_SYM)
117 + FreeProgram(sym->value.val.prog);
118 + else
119 + sym->type = MACRO_FUNCTION_SYM;
120 + sym->value.val.prog = prog;
122 + } else {
123 + subrPtr.val.prog = prog;
124 + subrPtr.tag = NO_TAG;
125 + sym = InstallSymbol(name, MACRO_FUNCTION_SYM, subrPtr);
128 + return True;
131 /* T Balinski */
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
153 --- old/doc/help.etx
154 +++ 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
159 string on error.
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
164 + defined functions.
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