comparison tests/agcl/oldagsrc/scr4d.syn @ 0:13d2b8934445

Import AnaGram (near-)release tree into Mercurial.
author David A. Holland
date Sat, 22 Dec 2007 17:52:45 -0500
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:13d2b8934445
1 {
2 /*
3 AnaGram Syntax Analyzer. Copyright (c) Jerome T. Holland, 1989, 1990, 1991.
4 All Rights Reserved.
5 */
6
7 #include HEADERS
8 #include PF
9
10 #include STDLIB
11 #include DATA
12 #include ASSERT
13 #include MYALLOC
14 #include ARRAYS
15 #include SP
16 #include SCREEN
17 #include STK
18 #include SCR4D
19 #include SETJMP
20 #include STDARG
21 #include STDIO
22 #include WIN
23 /* #include DIRECT */
24 #include DEMO
25
26 dc *activate_window(dc *);
27 void bury_top_image(void);
28 int chdir_s1(char*);
29 dc *check_selection(dc *);
30 dc *clear_mode(dc *);
31 int display_line_number(int);
32 extern dc *edit_window;
33 void force_screen_real(void);
34 void hide_cursor(void);
35 dc *prt(dc*);
36 extern dc *quick_ref_display;
37 void remove_ghost(dc *);
38 dc *open_windows(dc *);
39 dc *resize_window_mode(dc *);
40 void set_work_dir(void);
41 void update_screen(dc *);
42 dc *window_move(dc *);
43 int wkb(void);
44 void xeq_qa(void);
45
46 extern long current_date, expiration_date;
47
48
49 scr_pcb_type scr_pcb;
50 #define PCB scr_pcb
51
52 #define GET_INPUT PCB.input_code = wkb()
53 #define PARSE_STACK_OVERFLOW myabort();
54 #define SYNTAX_ERROR
55
56
57 extern rect mode_area;
58 extern rect position_area;
59 extern cint current_cursor;
60
61 extern dc *active_dc;
62 extern dc *cmnd_map_display;
63 extern dc *file_pick_display;
64 extern dc *help_index;
65 extern dc *pick_list_display;
66 extern dc *quick_ref_display;
67 extern dc *window_menu_display;
68
69 extern int n_windows;
70 extern char *string_base;
71
72 extern char *current_mode_string;
73
74 void sbeep(void);
75
76 }
77
78 [
79 ~declare pcb
80 ~diagnose errors
81 ~lines and columns
82 ~error frame
83 ~default reductions
84 line numbers
85 parser name = scr
86 test range
87 default token type = int
88 nest comments
89 event driven
90 near functions
91 ]
92
93 CURSOR UP = 328
94 page up = 329
95 CURSOR LEFT = 331
96 CURSOR RIGHT = 333
97 CURSOR DOWN = 336
98 page down = 337
99 control page up = 388
100 control page down = 374
101 control left = 371
102 control right = 372
103 home = 327
104 control home = 375
105 end = 335
106 control end = 373
107 escape = 27
108 return = '\r'
109 control w =23
110 control z =26
111
112 F1 = 315
113 F2 = 316
114 F3 = 317
115 F4 = 318
116 F5 = 319
117 F6 = 320
118 F7 = 321
119 F8 = 322
120 F9 = 323
121 F10 = 324
122
123 SHFT F1 = 340
124 SHFT F2 = 341
125 SHFT F3 = 342
126 SHFT F4 = 343
127 SHFT F5 = 344
128 SHFT F6 = 345
129 SHFT F7 = 346
130 SHFT F8 = 347
131 SHFT F9 = 348
132 SHFT F10 = 349
133
134 CTRL F1 = 350
135 CTRL F2 = 351
136 CTRL F3 = 352
137 CTRL F4 = 353
138 CTRL F5 = 354
139 CTRL F6 = 355
140 CTRL F7 = 356
141 CTRL F8 = 357
142 CTRL F9 = 358
143 CTRL F10 = 359
144
145 ALT F1 = 360
146 ALT F2 = 361
147 ALT F3 = 362
148 ALT F4 = 363
149 ALT F5 = 364
150 ALT F6 = 365
151 ALT F7 = 366
152 ALT F8 = 367
153 ALT F9 = 368
154 ALT F10 = 369
155
156 ALT 3 = 378
157
158 ALT G = 290
159 ALT L = 294
160 ALT N = 305
161 ALT P = 281
162 ALT R = 275
163 ALT S = 287
164 ALT T = 276
165 ALT X = 301
166 delete = 339
167
168 pick file = 256
169 init string edit = 257
170 out of time = 258
171
172 up = CURSOR UP
173 down = CURSOR DOWN
174 left = CURSOR LEFT
175 right = CURSOR RIGHT
176
177 move = F2
178 reduce = ALT F2
179
180 backspace = '\b'
181
182 enter line number = ALT L
183 help = F1
184 req help index = ALT F1
185 req key assign = SHFT F1
186 req cursor assign = CTRL F1
187 print table = ALT P
188 exit = ALT X
189 search previous = F3
190 create key = ALT S
191
192 search next = F4
193 bury = F5
194 bottom = F6
195 clone window = F7
196 cycle clone = ALT F7
197 req plane menu = ALT F8
198 previous = F8
199 req w menu = F9
200 req c menu = F10
201 req aux win menu = ALT F9
202 req aux cmnd menu = ALT F10
203 {
204 #define F1 315
205 #define F2 316
206 #define F3 317
207 #define F4 318
208 #define F5 319
209 #define F6 320
210 #define F7 321
211 #define F8 322
212 #define F9 323
213 #define F10 324
214 #define ALT_F1 360
215 #define ALT_F2 361
216 #define ALT_F3 362
217 #define ALT_F4 363
218 #define ALT_F5 364
219 #define ALT_F6 365
220 #define ALT_F7 366
221 #define ALT_F8 367
222 #define ALT_F9 368
223 #define ALT_F10 369
224
225 #define move_code F2
226 #define reduce ALT_F2
227 #define left 331
228 #define right 333
229
230 }
231
232 text char = 32..127
233 digit = '0-9'
234
235 [
236 default token type = dc *
237 default input type = int
238 ]
239
240 (void) edit session $
241 -> any window, quit
242 -> change directory, any edit string, exit
243 -> session complete
244 -> quit =naughty();
245
246 (void) quit
247 -> exit
248 -> any search key, exit
249 -> line number, exit
250
251 begin
252 -> req c menu =check_expiration();
253
254 any search key
255 -> search key
256 -> adjust search key
257
258 any edit string
259 -> edit string
260 -> adjust edit string
261
262 {
263
264 #ifdef DEMO_FLAG
265 void restrict_usage(void);
266
267 dc *check_expiration(void) {
268 long *ex = &expiration_date + 47;
269 long *cd = &current_date + 252;
270 if (ex[-47] < cd[-252]) restrict_usage();
271 return NULL;
272 }
273 #else
274 dc *check_expiration(void) {return NULL;}
275 #endif
276
277 }
278
279 window
280 -> begin =activate_cmnd_menu();
281 -> any window, req c menu =pop_up_window(cmnd_map_display);
282 -> any window, req w menu =pop_up_window(window_menu_display);
283 -> any window, '?' =pop_up_window(quick_ref_display);
284 -> change directory,
285 edit string:w, escape =rcs(), search_flag--, quit_window(w);
286
287 any window
288 -> window:w =check_expiration(),w;
289 -> adjust window:w =check_expiration(),w;
290
291 window, session complete, change directory
292 -> any window:d, return =(*d->enter)(d);
293
294 {
295 void set_mode(char *);
296
297 dc *replace_window(dc *d, dc *new);
298 dc *pop_up_window(dc *d);
299
300 }
301
302 (int) specify line number
303 -> line number:n, return =end_line_number_mode(n);
304
305 {
306 static int end_line_number_mode(int n){
307 flash_str_fill(mode_area.pos,current_mode_string,0,mode_area.size.x);
308 return n;
309 }
310 }
311
312 (int) specify lines back
313 -> line number:n, up + '-' =end_line_number_mode(n);
314
315
316 (int) specify lines forward
317 -> line number:n, down + '+' =end_line_number_mode(n);
318
319 (int) line number
320 -> enter line number =line_number_1();
321 -> line number:n, digit:d =line_number_2(n,d);
322 -> line number:n, backspace =line_number_3(n);
323 -> line number:n, delete =line_number_3(n);
324 {
325 static dc *reset_position_window(dc *d) {
326 flash_str_fill(mode_area.pos,current_mode_string,0,mode_area.size.x);
327 current_cursor.x = -1;
328 return d;
329 }
330
331 static int line_number_1(void) {
332 flash_str_fill(mode_area.pos,"Line Number",0,mode_area.size.x);
333 return 0;
334 }
335
336 static int line_number_2(int n, int d) {
337 return display_line_number(10*n+d-48);
338 }
339 static int line_number_3(int n) {
340 return display_line_number(n/10);
341 }
342
343 dc *find_help(char *);
344 dc *pop_up_window(dc *);
345
346 static dc *key_assign(dc *dm, char *title) {
347 dc *d = find_help(title);
348 if (d == NULL) return beep(dm);
349 return pop_up_window(d);
350 }
351 }
352
353 window
354 -> window:w, escape =quit_window(w);
355 -> any window:w, help =help_window(w);
356 -> any window, req help index =pop_up_window(help_index);
357 -> any window:w, req key assign =key_assign(w,"Function Keys");
358 -> any window:w, req cursor assign =key_assign(w,"Cursor Keys");
359 -> any window:w, print table =prt(w);
360
361 -> window:w, control key:k =cursor(w,k);
362 -> previous window
363 -> bottom window
364 -> bury window
365 -> adjust window, escape
366 -> adjust window:w, non cursor key:k =control(w,k);
367 -> any window:w, search forward =search_forward(w);
368 -> any window:w, search reverse =search_reverse(w);
369 -> any window:w, text char - '?':c =alpha_access(w,c);
370 -> any window, edit search key
371
372 -> any window:w, specify line number:n =reposition_cursor(w,n);
373 -> any window:w, specify lines back:n =backup_cursor(w,n);
374 -> any window:w, specify lines forward:n =advance_cursor(w,n);
375 -> any window:w, line number, escape =reset_position_window(w);
376
377 -> any window:w, clone window =clone_window(w);
378
379 -> any window:w, cycle clone =cycle_clone(w);
380 -> any window:w, req aux win menu =pop_up_aux_win_menu(w);
381 -> any window:w, req aux cmnd menu =pop_up_aux_cmnd_menu(w);
382 -> any window:w, req plane menu =open_windows(w);
383
384 {
385 dc *pop_up_aux_win_menu(dc *);
386 dc *pop_up_aux_cmnd_menu(dc *);
387
388 dc *first_clone(dc *);
389
390 static dc *cycle_clone(dc *d) {
391 dc *c;
392 if (d->no_clone) return beep(d);
393 c = first_clone(d);
394 if (c != NULL) return pop_up_window(c);
395 return beep(d);
396 }
397 }
398 previous window
399 -> any window:w, previous =previous_window(w);
400
401 bottom window
402 -> any window:w, bottom =bottom_window(w);
403
404 bury window
405 -> any window:w, bury =bury_window(w);
406
407 search forward
408 -> search next
409 -> any search key:sk, search next + return =save_search_key(sk);
410 -> search key:sk, down =save_search_key(sk);
411
412 search reverse
413 -> search previous
414 -> any search key:sk, search previous =save_search_key(sk);
415 -> search key:sk, up =save_search_key(sk);
416
417 edit search key
418 -> search key:sk, escape =quit_search(sk);
419
420 {
421 extern char *search_key;
422 char *old_string;
423 int search_key_index;
424
425 char *build_string(void);
426 extern int search_flag;
427
428 static dc *save_search_key(dc *d) {
429 if (search_key != NULL) free(search_key);
430 search_flag--;
431 search_key = build_string();
432 close_window(d);
433 hide_cursor();
434 activate_window(map_window_plane[--nplanes].d);
435 return active_dc;
436 }
437
438 extern char work_dir_name[];
439
440 void set_work_dir(void);
441
442 static dc *chdir_s2(dc *d) {
443 tss();
444 if (chdir_s1(string_base)) return beep(d);
445 rcs();
446 search_flag--;
447 CHANGE_REDUCTION(new_directory);
448 set_work_dir();
449 /* getcwd(work_dir_name, MAXPATH); */
450 set_work_dir();
451 close_window(d);
452 hide_cursor();
453 activate_window(map_window_plane[--nplanes].d);
454 return active_dc;
455 }
456
457 static dc *quit_search(dc *d) {
458 close_window(d);
459 rcs();
460 search_flag--;
461 hide_cursor();
462 activate_window(map_window_plane[--nplanes].d);
463 ok_ptr(active_dc->des);
464 active_dc->des->c_loc_doc.x = 0;
465 return active_dc;
466 }
467 }
468
469 search key
470 -> create key =init_search_window();
471 -> search key:sk, left:k =fiddle_window(sk,k);
472 -> search key:sk, right =search_key_right(sk);
473 -> any search key:sk, text char:c =insert_text(sk,c);
474 -> any search key:sk, backspace =backspace_char(sk);
475 -> any search key:sk, delete =delete_char(sk);
476 -> search key:sk, home:k =fiddle_window(sk,k);
477 -> search key:sk, end =search_key_end(sk);
478 -> any search key:sk, control left:k =fiddle_window(sk,k);
479 -> any search key:sk, control right:k =fiddle_window(sk,k);
480 -> adjust search key, escape
481
482 window
483 -> change directory, new directory:d =d;
484
485 edit string, new directory
486 -> edit string:d, return =chdir_s2(d);
487
488 edit string
489 -> init string edit =edit_window;
490 -> edit string:sk, left:k =fiddle_window(sk,k);
491 -> edit string:sk, right =search_key_right(sk);
492 -> edit string:sk, home:k =fiddle_window(sk,k);
493 -> edit string:sk, end =search_key_end(sk);
494 -> adjust edit string, escape
495 -> any edit string:sk, text char:c =insert_text(sk,c);
496 -> any edit string:sk, backspace =backspace_char(sk);
497 -> any edit string:sk, delete =delete_char(sk);
498 -> any edit string:sk, control left:k =fiddle_window(sk,k);
499 -> any edit string:sk, control right:k =fiddle_window(sk,k);
500
501 {
502 void search_key_line(void) {
503 tss();
504 sss(string_base);
505 }
506
507 static dc *search_key_right(dc *d) {
508 if( tis() <= d->des->c_loc_doc.x) {
509 int c;
510 if (search_key == NULL) return d;
511 c = old_string[search_key_index];
512 if (c == 0) return d;
513 acs(c);
514 search_key_index++;
515 ok_ptr(d->des);
516 d->des->refresh++;
517 }
518 fiddle_window(d,right);
519 return d;
520 }
521 static dc *search_key_end(dc *d) {
522 ok_ptr(d->des);
523
524 if( tis() <= d->des->c_loc_doc.x) {
525 int c = old_string[search_key_index];
526 while (c) {
527 acs(c);
528 c = old_string[++search_key_index];
529 }
530 d->des->refresh++;
531 }
532 d->des->c_loc_doc.x = tis();
533 bound_cursor_hor(d->des);
534 return d;
535 }
536
537 static dc *insert_text(dc *d, int c) {
538 wd *w;
539
540 w = d->des;
541 ok_ptr(w);
542 its(c, w->c_loc_doc.x);
543 fiddle_window(d,right);
544 w->refresh++;
545 return d;
546 }
547 static dc *delete_char(dc *d) {
548 ok_ptr(d->des);
549 dcs(d->des->c_loc_doc.x);
550 d->des->refresh++;
551 return d;
552 }
553
554 static dc *backspace_char(dc *d) {
555 wd *w;
556
557 w = d->des;
558 if (w->c_loc_doc.x == 0) return d;
559 fiddle_window(d,left);
560 delete_char(d);
561 return d;
562 }
563
564 }
565 adjust edit string
566 -> {reduce edit string | move edit string}: sk =clear_mode(sk);
567
568 adjust search key
569 -> {reduce search key | move search key}:sk =clear_mode(sk);
570
571 adjust window
572 -> {resize window | move window}:sk =clear_mode(sk);
573
574 move search key
575 -> any search key:sk, move:k =show_mode(sk,k);
576 -> move search key:sk, cursor control:k =move(sk,k);
577
578 reduce search key
579 // -> {search key | adjust search key}:sk, reduce:k =show_mode(sk,k);
580 -> any search key:sk, reduce:k =show_mode(sk,k);
581 -> reduce search key:sk, cursor control:k =resize(sk,k);
582
583 move edit string
584 -> any edit string:sk, move:k =show_mode(sk,k);
585 -> move edit string:sk, cursor control:k =move(sk,k);
586
587 reduce edit string
588 -> any edit string:sk, reduce:k =show_mode(sk,k);
589 -> reduce edit string:sk, cursor control:k =resize(sk,k);
590
591 move window
592 -> any window:w, move:k =show_mode(w,k);
593 -> move window:w, cursor control:k =move(w,k);
594
595 resize window //, window
596 -> any window:w, reduce:k =show_mode(w,k);
597 -> resize window:w, cursor control:k =resize(w,k);
598
599 {
600 static dc *show_mode(dc *d, int t) {
601 char *ms = "";
602
603 ok_ptr(d);
604 switch (t) {
605 case move_code:
606 /*
607 if (d->move == NULL) {
608 PCB.reduction_token = scr_window_token;
609 beep(d);
610 break;
611 }
612 */
613 ms = "Move Window";
614 break;
615 case reduce:
616 /*
617 if (d->resize == NULL) {
618 beep(d);
619 PCB.reduction_token = scr_window_token;
620 break;
621 }
622 */
623 ms = "Resize Window";
624 break;
625 }
626 flash_str_fill(mode_area.pos,ms,0,mode_area.size.x);
627 return d;
628 }
629
630 }
631
632 (int) cursor control
633 -> up
634 -> down
635 -> left
636 -> right
637 -> page up
638 -> page down
639 -> home
640 -> end
641
642 (int) control key
643 -> cursor control
644 -> non cursor key
645
646 (int) non cursor key
647 -> control home
648 -> control end
649 -> control page up
650 -> control page down
651 -> control right
652 -> control left
653 -> control w
654 -> control z
655
656 {
657
658 cint ci();
659 cint aci();
660 cint sci();
661 cint ulci();
662
663 extern int start_keys[];
664 extern dc *error_display;
665
666 void log_error(void);
667
668 void pop_up_code_segment(char *, char *);
669
670 dc *resize_window_mode(dc *d) {
671 set_mode("Resize Window");
672 CHANGE_REDUCTION(resize_window);
673 return d;
674 }
675
676 dc *window_move(dc *d) {
677 set_mode("Move Window");
678 CHANGE_REDUCTION(move_window);
679 return d;
680 }
681
682 static dc *naughty(void) {
683 force_screen_real();
684 pop_up_code_segment("birb", "");
685 wkb();
686 return NULL;
687 }
688
689 void deactivate_window(dc *);
690
691 static dc *activate_cmnd_menu(void) {
692 dc *new;
693 force_screen_real();
694 if (active_dc != NULL) {
695 if (active_dc != quick_ref_display) return active_dc;
696 deactivate_window(active_dc);
697 }
698 new = activate_window(cmnd_map_display);
699 if (nerrors) new = pop_up_window(error_display);
700 return new;
701 }
702
703
704 extern dc *search_key_window;
705
706
707 static dc *edit_search(void) {
708 cint loc;
709 cint corner;
710 dc *d;
711 rect w;
712
713 d = active_dc;
714 loc = aci(d->act->c_loc_scr, ci(1,1));
715 deactivate_window(d);
716 w = place_rect(display_area, search_key_window->des->b_size,22);
717 corner = w.pos;
718 search_key_window->des->b_loc_scr = ulci(loc,corner);
719 search_key_window->des->b_size = w.size;
720 activate_window(search_key_window);
721 return active_dc;
722 }
723
724 static dc *init_search_window(void) {
725 ics();
726 search_flag++;
727 ok_ptr(search_key_window->des);
728 search_key_window->des->c_loc_doc.x = 0;
729 search_key_index = 0;
730 old_string = search_key;
731
732 return edit_search();
733 }
734
735
736 int do_key(int x) {
737 PCB.input_code = x;
738 scr();
739 if (PCB.exit_flag == AG_SYNTAX_ERROR_CODE) {
740 sbeep();
741 PCB.exit_flag = AG_RUNNING_CODE;
742 }
743 return (PCB.exit_flag == AG_RUNNING_CODE);
744 }
745
746 }