1 Subject: escape_literal() macro
3 Escape special chars in ~string~, so that the string can be searched with a
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
48 + * escaped_string = escape_literal(string)
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;
62 + return wrongNArgsErr(errMsg);
65 + if (!readStringArg(argList[0], &string, stringStorage, errMsg)) {
69 + stringlen = strlen(string);
71 + escstringlen = stringlen;
72 + for (i = 0; i < stringlen; i++) {
73 + if (strchr(chars_to_escape, string[i])) {
78 + result->tag = STRING_TAG;
79 + if (!AllocNString(&result->val.str, escstringlen + 1)) {
80 + M_FAILURE("Failed to allocate return value in %s");
83 + escstring = result->val.str.rep;
85 + if (strchr(chars_to_escape, *string)) {
86 + *escstring++ = '\\';
88 + *escstring++ = *string++;
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
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
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\