Program memory leaks
[nedit-bw.git] / escape_literal_macro.patch
blobd939c309148524f5fae0be99442e5ea99ac53939
1 Subject: escape_literal() macro
3 Escape special chars in ~string~, so that the string can be searched with a
4 regular expression.
6 ---
8 doc/help.etx | 4 +++
9 source/highlightData.c | 2 -
10 source/macro.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++
11 3 files changed, 56 insertions(+), 1 deletion(-)
13 diff --quilt old/source/macro.c new/source/macro.c
14 --- old/source/macro.c
15 +++ new/source/macro.c
16 @@ -460,10 +460,12 @@ static int toColumnMS(WindowInfo *window
18 static int timerAddMS(WindowInfo *window, DataValue *argList,
19 int nArgs, DataValue *result, char **errMsg);
20 static int timerRemoveMS(WindowInfo *window, DataValue *argList,
21 int nArgs, DataValue *result, char **errMsg);
22 +static int escapeLiteralMS(WindowInfo *window, DataValue *argList,
23 + int nArgs, DataValue *result, char **errMsg);
25 /* Built-in subroutines and variables for the macro language */
26 static const BuiltInSubrName MacroSubrs[] = {
27 { "length", lengthMS },
28 { "get_range", getRangeMS },
29 @@ -534,10 +536,11 @@ static const BuiltInSubrName MacroSubrs[
30 { "to_line", toLineMS },
31 { "to_column", toColumnMS },
32 { "set_window_title", setWindowTitleMS },
33 { "timer_add", timerAddMS },
34 { "timer_remove", timerRemoveMS },
35 + { "escape_literal", escapeLiteralMS },
36 { NULL, NULL } /* sentinel */
39 static const BuiltInSubrName SpecialVars[] = {
40 { "$cursor", cursorMV },
41 @@ -3966,10 +3969,58 @@ static int timerRemoveMS(WindowInfo *win
44 return True;
47 +/*
48 + * escaped_string = escape_literal(string)
49 + */
50 +static int escapeLiteralMS(WindowInfo *window, DataValue *argList, int nArgs,
51 + DataValue *result, char **errMsg)
53 + static const char chars_to_escape[] = "()[]<>{}.\\|^$*+?&";
54 + char stringStorage[TYPE_INT_STR_SIZE(int)];
55 + char *string = NULL;
56 + char *escstring = NULL;
57 + int stringlen;
58 + int escstringlen;
59 + int i;
61 + if (nArgs != 1) {
62 + return wrongNArgsErr(errMsg);
63 + }
65 + if (!readStringArg(argList[0], &string, stringStorage, errMsg)) {
66 + return False;
67 + }
69 + stringlen = strlen(string);
71 + escstringlen = stringlen;
72 + for (i = 0; i < stringlen; i++) {
73 + if (strchr(chars_to_escape, string[i])) {
74 + escstringlen++;
75 + }
76 + }
78 + result->tag = STRING_TAG;
79 + if (!AllocNString(&result->val.str, escstringlen + 1)) {
80 + M_FAILURE("Failed to allocate return value in %s");
81 + }
83 + escstring = result->val.str.rep;
84 + while (*string) {
85 + if (strchr(chars_to_escape, *string)) {
86 + *escstring++ = '\\';
87 + }
88 + *escstring++ = *string++;
89 + }
90 + *escstring = '\0';
92 + return True;
95 /* T Balinski */
96 static int listDialogMS(WindowInfo *window, DataValue *argList, int nArgs,
97 DataValue *result, char **errMsg)
99 macroCmdInfo *cmdData;
100 diff --quilt old/doc/help.etx new/doc/help.etx
101 --- old/doc/help.etx
102 +++ new/doc/help.etx
103 @@ -2701,10 +2701,14 @@ Macro Subroutines
104 Additional optional arguments represent labels for buttons to appear along
105 the bottom of the dialog. Returns the number of the button pressed (the
106 first button is number 1), or 0 if the user closed the dialog via the window
107 close box.
109 +**escape_literal( string )**
110 + Escape special chars in ~string~, so that the string can be searched with a
111 + regular expression.
113 **filename_dialog( [title[, mode[, defaultPath[, filter[, defaultName]]]]] )**
114 Presents a file selection dialog with the given title to the user that
115 prompts for a new or existing file.
117 Options are: ~title~ will be the title of the dialog, defaults to "Choose
118 diff --quilt old/source/highlightData.c new/source/highlightData.c
119 --- old/source/highlightData.c
120 +++ new/source/highlightData.c
121 @@ -549,11 +549,11 @@ static char *DefaultPatternSets[] = {
122 README:\"NEdit Macro syntax highlighting patterns, version 2.6, maintainer Thorsten Haude, nedit at thorstenhau.de\":::Flag::D\n\
123 Comment:\"#\":\"$\"::Comment::\n\
124 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\
125 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\
126 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\
127 - Built-in Subrs:\"<(?:append_file|beep|call|calltip|clipboard_to_string|define|dialog|filename_dialog|dict_(?:insert|complete|save|append|is_element)|focus_window|get_character|get_matching|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|set_transient|set_window_title|shell_command|split|string_compare|string_dialog|string_to_clipboard|substring|t_print|timer_(?:add|remove)|to_(?:column|line|pos)|tolower|toupper|valid_number|write_file)(?=\\s*\\()\":::Subroutine::\n\
128 + Built-in Subrs:\"<(?:append_file|beep|call|calltip|clipboard_to_string|define|dialog|filename_dialog|dict_(?:insert|complete|save|append|is_element)|escape_literal|focus_window|get_character|get_matching|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|set_transient|set_window_title|shell_command|split|string_compare|string_dialog|string_to_clipboard|substring|t_print|timer_(?:add|remove)|to_(?:column|line|pos)|tolower|toupper|valid_number|write_file)(?=\\s*\\()\":::Subroutine::\n\
129 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\
130 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|deselect-all|deselect_all|focusIn|focusOut|process-return|process_return|process-tab|process_tab|insert-string|insert_string|mouse_pan)(?=\\s*\\()\":::Subroutine::\n\
131 Macro Hooks:\"<(?:(?:pre|post)_(?:open|save)|cursor_moved|modified|(?:losing_)?focus)_hook(?=\\s*\\()\":::Subroutine1::\n\
132 Keyword:\"<(?:break|continue|define|delete|else|for|if|in|return|typeof|while)>\":::Keyword::\n\
133 Braces:\"[{}\\[\\]]\":::Keyword::\n\