break/continue to outer loops, !!booleanize
[nedit-bw.git] / nested-subroutines.patch
blobc25ff0571786cce4669ddae5c5fe1ef7b2f36126
1 ---
3 source/highlightData.c | 2 -
4 source/interpret.c | 46 +++++++++++++++++++++++++++++++++++++---
5 source/interpret.h | 4 ++-
6 source/macro.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++
7 4 files changed, 101 insertions(+), 6 deletions(-)
9 diff --quilt old/source/interpret.c new/source/interpret.c
10 --- old/source/interpret.c
11 +++ new/source/interpret.c
12 @@ -294,6 +294,7 @@ Program *FinishCreatingProgram(Accumulat
13 progLen = ProgP - Prog;
14 newProg->code = (Inst *)XtCalloc(progLen, sizeof(Inst));
15 memcpy(newProg->code, Prog, progLen * sizeof(Inst));
16 + newProg->nested = False;
17 newProg->refcount = 1;
19 DISASM(newProg->name, newProg->code, ProgP - Prog);
20 @@ -587,6 +588,29 @@ static int setupFrame(RestartData *conte
21 return STAT_OK;
24 +/*
25 +** setup a nested frame:
26 +**
27 +** - use arguments from current frame
28 +** - use local symbol list from current frame
29 +*/
30 +static int setupNestedFrame(RestartData *context, Program *prog)
32 + int ret;
33 + int nArgs = FP_GET_ARG_COUNT(context->frameP);
34 + DataValue *args = &FP_GET_ARG_N(context->frameP, 0);
35 + DataValue argArray = FP_GET_ARG_ARRAY(context->frameP);
36 + Symbol *symList = FP_GET_SYM_TAB(context->frameP);
38 + ret = setupFrame(context, prog, nArgs, args, argArray, prog->name);
40 + if (ret == STAT_OK) {
41 + FP_GET_SYM_TAB(context->frameP) = symList;
42 + }
44 + return STAT_OK;
47 static void rewindFrame(RestartData *context)
49 /* get stored return information */
50 @@ -595,8 +619,7 @@ static void rewindFrame(RestartData *con
51 Inst *newPC = FP_GET_RET_PC(context->frameP);
52 Program *prog = FP_GET_PROG(context->frameP);
53 Symbol *symList = FP_GET_SYM_TAB(context->frameP);
55 - freeSymbolList(symList);
56 + int isNestedFrame = prog->nested;
58 /* pop past local variables */
59 context->stackP = context->frameP;
60 @@ -608,6 +631,14 @@ static void rewindFrame(RestartData *con
61 FreeProgram(prog);
63 context->pc = newPC;
65 + if (!isNestedFrame) {
66 + freeSymbolList(symList);
67 + }
68 + else {
69 + /* copy the local symlist back to this frame */
70 + FP_GET_SYM_TAB(context->frameP) = symList;
71 + }
74 static void rewindStack(RestartData *context)
75 @@ -2680,8 +2711,14 @@ static int callSubroutineFromSymbol(Symb
76 if (sym->value.tag == MACRO_SUBR_TAG) {
77 prog = sym->value.val.prog;
78 prog->refcount++;
79 - /* -nArgs means 'arguments are on stack' */
80 - return setupFrame(Interpreter, prog, -nArgs, NULL, argArray, sym->name);
81 + if (prog->nested) {
82 + return setupNestedFrame(Interpreter, prog);
83 + }
84 + else {
85 + /* -nArgs means 'arguments are on stack' */
86 + return setupFrame(Interpreter, prog, -nArgs, NULL, argArray,
87 + sym->name);
88 + }
92 @@ -4878,3 +4915,4 @@ static void stackdump(RestartData *conte
95 #endif /* ifdef DEBUG_STACK */
97 diff --quilt old/source/interpret.h new/source/interpret.h
98 --- old/source/interpret.h
99 +++ new/source/interpret.h
100 @@ -123,7 +123,8 @@ typedef struct SymbolRec {
101 typedef struct ProgramTag {
102 const char *name;
103 Inst *code;
104 - unsigned refcount;
105 + unsigned nested:1;
106 + unsigned refcount:31;
107 } Program;
109 /* Information needed to re-start a preempted macro */
110 @@ -213,3 +214,4 @@ const char *longAsStr(long val);
111 int lenLongAsStr(long val);
113 #endif /* NEDIT_INTERPRET_H_INCLUDED */
115 diff --quilt old/source/macro.c new/source/macro.c
116 --- old/source/macro.c
117 +++ new/source/macro.c
118 @@ -475,6 +475,9 @@ static int timerRemoveMS(WindowInfo *win
119 static int escapeLiteralMS(WindowInfo *window, DataValue *argList,
120 int nArgs, DataValue *result, char **errMsg);
122 +static int evalMS(WindowInfo *window, DataValue *argList,
123 + int nArgs, DataValue *result, char **errMsg);
125 /* Built-in subroutines and variables for the macro language */
126 static const BuiltInSubrName MacroSubrs[] = {
127 { "args", argsMS },
128 @@ -554,6 +557,7 @@ static const BuiltInSubrName MacroSubrs[
129 { "escape_literal", escapeLiteralMS },
130 { "full_file_name", fullFileNameMS },
131 { "join", joinMS },
132 + { "eval", evalMS },
133 { NULL, NULL } /* sentinel */
136 @@ -4217,6 +4221,57 @@ static int escapeLiteralMS(WindowInfo *w
137 return True;
142 + */
143 +static int evalMS(WindowInfo *window, DataValue *argList, int nArgs,
144 + DataValue *result, char **errMsg)
146 + char stringStorage[TYPE_INT_STR_SIZE(int)];
147 + char *macro = NULL;
148 + char *macronl = NULL;
149 + char *stoppedAt = NULL;
150 + Program *prog;
151 + int ret;
153 + if (nArgs != 1) {
154 + return wrongNArgsErr(errMsg);
156 + if (!readStringArg(argList[0], &macro, stringStorage[0], errMsg)) {
157 + return False;
160 + /* add a terminating newline */
161 + macronl = XtMalloc(strlen(macro) + 2);
162 + if (!macronl) {
163 + *errMsg = "Internal error";
164 + return False;
166 + strcpy(macronl, macro);
167 + strcat(macronl, "\n");
169 + fprintf(stderr, "%s", macronl);
171 + /* Parse the macro and report errors if it fails */
172 + prog = ParseMacro(macronl, errMsg, &stoppedAt, False, "eval");
173 + if (!prog) {
174 + ParseError(window->macroCmdData ? window->shell : NULL,
175 + macronl, stoppedAt, "eval", *errMsg);
176 + XtFree(macronl);
177 + return False;
179 + XtFree(macronl);
181 + prog->nested = True;
182 + prog->refcount = 0;
184 + ret = OverlayRoutineFromProg(prog, nArgs, nArgs);
185 + if (!ret) {
186 + FreeProgram(prog);
188 + return ret;
191 /* T Balinski */
192 static int listDialogMS(WindowInfo *window, DataValue *argList, int nArgs,
193 DataValue *result, char **errMsg)
194 diff --quilt old/source/highlightData.c new/source/highlightData.c
195 --- old/source/highlightData.c
196 +++ new/source/highlightData.c
197 @@ -554,7 +554,7 @@ static char *DefaultPatternSets[] = {
198 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\
199 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\
200 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\
201 - Built-in Subrs:\"<(?:args|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|n_args|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\
202 + Built-in Subrs:\"<(?:args|append_file|beep|call|calltip|clipboard_to_string|define|dialog|eval|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|n_args|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\
203 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\
204 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\
205 Macro Hooks:\"<(?:(?:pre|post)_(?:open|save)|cursor_moved|modified|(?:losing_)?focus)_hook(?=\\s*\\()\":::Subroutine1::\n\