3 source/highlightData.c | 2
4 source/parse.y | 188 ++++++++++++++++++++++++++++++++++++++++++++++++-
5 2 files changed, 188 insertions(+), 2 deletions(-)
7 diff --quilt old/source/highlightData.c new/source/highlightData.c
8 --- old/source/highlightData.c
9 +++ new/source/highlightData.c
10 @@ -558,7 +558,7 @@ static char *DefaultPatternSets[] = {
11 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\
12 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\
13 Macro Hooks:\"<(?:(?:pre|post)_(?:open|save)|cursor_moved|modified|(?:losing_)?focus)_hook(?=\\s*\\()\":::Subroutine1::\n\
14 - Keyword:\"<(?:break|continue|define|delete|do|else|finally|for|if|in|readonly|return|typeof|while)>\":::Keyword::\n\
15 + Keyword:\"<(?:break|case|continue|default|define|delete|do|else|finally|for|if|in|readonly|return|switch|typeof|while)>\":::Keyword::\n\
16 Braces:\"[{}\\[\\]]\":::Keyword::\n\
17 Global Variable:\"\\$[A-Za-z0-9_]+\":::Identifier1::\n\
18 String sq:\"'\":\"'\"::String::\n\
19 diff --quilt old/source/parse.y new/source/parse.y
20 --- old/source/parse.y
21 +++ new/source/parse.y
22 @@ -109,6 +109,61 @@ static int nextSymIsField = 0;
23 /* set to 1 when we don't want a full symbol, just a name (string) for a
24 field name following a '.' */
26 +#define PTRBLK_SIZE ((64 - sizeof(void *)) / sizeof(void *))
27 +typedef struct PtrBlkTag {
28 + void *ptrs[PTRBLK_SIZE];
29 + struct PtrBlkTag *next;
31 +typedef struct PtrListTag {
32 + PtrBlk *head, *tail;
36 +#define PTRBLK_START(tgt) \
38 + (tgt).head = (tgt).tail = NULL; \
42 +#define PTRBLK_CPY(tgt, src) \
44 + (tgt).head = (src).head; \
45 + (tgt).tail = (src).tail; \
46 + (tgt).nPtrs = (src).nPtrs; \
49 +#define PTRBLK_ADD(tgt, ptr) \
51 + if ((tgt).nPtrs % PTRBLK_SIZE == 0) { \
52 + PtrBlk *ptrblk = malloc(sizeof(*ptrblk)); \
53 + ptrblk->next = NULL; \
54 + if ((tgt).head == NULL) { \
55 + (tgt).head = (tgt).tail = ptrblk; \
58 + (tgt).tail->next = ptrblk; \
59 + (tgt).tail = ptrblk; \
62 + (tgt).tail->ptrs[(tgt).nPtrs % PTRBLK_SIZE] = (ptr); \
66 +#define PTRBLK_FORALL(src, ...) \
69 + while (i < (src).nPtrs) { \
70 + void *ptr = (src).head->ptrs[i % PTRBLK_SIZE]; \
73 + if (i % PTRBLK_SIZE == 0 || i == (src).nPtrs) { \
74 + PtrBlk *next = (src).head->next; \
76 + (src).head = next; \
84 @@ -117,12 +172,17 @@ static int nextSymIsField = 0;
94 %token <str> SYMBOL STRING FIELD
96 %token DELETE ARG_LOOKUP
97 %token IF WHILE DO ELSE FOR BREAK CONTINUE RETURN DEFINE TYPEOF KEYVAL READONLY
99 +%token FINALLY SWITCH CASE DEFAULT
100 %type <num> keyargs key keyopt catlist fnarglsopt fnarglist fnarg
101 %type <inst> cond branch for while do else and or mark
103 @@ -134,6 +194,9 @@ static int nextSymIsField = 0;
106 %type <inst> thenx elsex thenelsex
107 +%type <inst> switch case switchcont
109 +%type <cstmts> casestmts
113 @@ -183,6 +246,9 @@ blockwb: '{' blank stmts '}' blank
123 @@ -266,6 +332,32 @@ stmt: ';' blank
124 ADD_OP(OP_FINALIZE_LOOP);
127 + | switch '(' switchcont numexpr mark ')' '{' blank casestmts '}'
130 + /* simulated break statement */
131 + ADD_OP(OP_PUSH_IMMED); ADD_IMMED(0);
132 + /* fill startLoop with endLoop addr */
133 + SET_BR_OFF($1, GetPC());
134 + /* continue is pop before numexpr */
135 + ADD_OP(OP_END_LOOP); ADD_BR_OFF($3);
136 + /* empty finally block */
137 + ADD_OP(OP_PEEK_POP); ADD_IMMED(2);
138 + ADD_OP(OP_FINALIZE_LOOP);
140 + /* clear casestmts plist */
141 + while (i < $9.plist.nPtrs) {
142 + void *ptr = $9.plist.head->ptrs[i % PTRBLK_SIZE];
144 + if (i % PTRBLK_SIZE == 0 || i == $9.plist.nPtrs) {
145 + PtrBlk *next = $9.plist.head->next;
146 + free($9.plist.head);
147 + $9.plist.head = next;
153 | BREAK numexpropt stmtend blank {
154 ADD_OP(OP_BREAK_LOOP);
156 @@ -744,6 +836,8 @@ do: DO blank { START_LOOP($$); }
158 for: FOR blank { START_LOOP($$); }
160 +switch: SWITCH blank { START_LOOP($$); }
163 ADD_OP(OP_BRANCH); $$ = GetPC(); ADD_BR_OFF(0);
165 @@ -788,6 +882,83 @@ thenelsex: TE {
174 +case: CASE dup '(' blank numexpr ')' ':' blank {
176 + ADD_OP(OP_BRANCH_TRUE);
177 + $$ = GetPC(); ADD_BR_OFF(0);
179 + | DEFAULT ':' blank {
181 + $$ = GetPC(); ADD_BR_OFF(0);
187 + PTRBLK_ADD($$, $1);
190 + PTRBLK_CPY($$, $1);
191 + PTRBLK_ADD($$, $2);
197 + PTRBLK_START($$.plist);
200 + yyerror("statements before any case"); YYERROR;
202 + | casestmts mark cases {
204 + /* we move the cases by this number back */
205 + ptrdiff_t stmtsLen = $2 - $1.start;
206 + /* we move the previously stmts by this number forth */
207 + ptrdiff_t casesLen = GetPC() - $2;
209 + $$.plist = $1.plist;
211 + /* add branch to new cases */
213 + while (i < $3.nPtrs) {
214 + Inst *br = $3.head->ptrs[i % PTRBLK_SIZE];
215 + SET_BR_OFF(br, GetPC() + stmtsLen - casesLen);
216 + PTRBLK_ADD($$.plist, br - stmtsLen);
218 + if (i % PTRBLK_SIZE == 0 || i == $3.nPtrs) {
219 + PtrBlk *next = $3.head->next;
225 + /* move new cases infront of all previously statements */
226 + $$.start = SwapCode($1.start, $2, GetPC());
228 + /* add the offset to all previously branch offsets */
230 + curr = $$.plist.head;
231 + while (i < $$.plist.nPtrs) {
232 + Inst *br = $$.plist.head->ptrs[i % PTRBLK_SIZE];
233 + br->val.branch += casesLen;
235 + if (i % PTRBLK_SIZE == 0 || i == $$.plist.nPtrs) {
240 + | casestmts stmtswoptb {
241 + $$.plist = $1.plist;
242 + $$.start = $1.start;
249 @@ -799,6 +970,18 @@ branch: /* nothing */ {
254 +** for continuing a switch, we need to pop the first expression from the stack,
255 +** but not for the first one, value is the continue address
257 +switchcont: /* nothing */ {
262 + SET_BR_OFF($$ - 1, GetPC());
268 @@ -941,6 +1124,9 @@ static int yylex(void)
269 if (!strcmp(symName, "typeof")) return TYPEOF;
270 if (!strcmp(symName, "readonly")) return READONLY;
271 if (!strcmp(symName, "finally")) return FINALLY;
272 + if (!strcmp(symName, "switch")) return SWITCH;
273 + if (!strcmp(symName, "case")) return CASE;
274 + if (!strcmp(symName, "default")) return DEFAULT;
276 yylval.str = LookupString(symName, True);
277 if (nextSymIsField) {