Commit 45c502d8fd102b9c943d2a52e4cb9fcb5424be92
1 parent
1704e934
Exists in
master
and in
5 other branches
Migrando funções ANSI para multi-sessão
Showing
6 changed files
with
335 additions
and
273 deletions
Show diff stats
src/include/lib3270/session.h
... | ... | @@ -264,6 +264,34 @@ |
264 | 264 | int end; |
265 | 265 | } select; |
266 | 266 | |
267 | + // ansi.c | |
268 | + int scroll_top; | |
269 | + int scroll_bottom; | |
270 | + int once_cset; | |
271 | + int saved_cursor; | |
272 | + | |
273 | + int held_wrap : 1; | |
274 | + | |
275 | + int insert_mode : 1; | |
276 | + int auto_newline_mode : 1; | |
277 | + | |
278 | + int appl_cursor : 1; | |
279 | + int saved_appl_cursor : 1; | |
280 | + | |
281 | + int wraparound_mode : 1; | |
282 | + int saved_wraparound_mode : 1; | |
283 | + | |
284 | + int rev_wraparound_mode : 1; | |
285 | + int saved_rev_wraparound_mode : 1; | |
286 | + | |
287 | + int allow_wide_mode : 1; | |
288 | + int saved_allow_wide_mode : 1; | |
289 | + | |
290 | + int wide_mode : 1; | |
291 | + int saved_wide_mode : 1; | |
292 | + | |
293 | + int saved_altbuffer : 1; | |
294 | + | |
267 | 295 | // xio |
268 | 296 | void * ns_read_id; |
269 | 297 | void * ns_exception_id; | ... | ... |
src/lib3270/ansi.c
... | ... | @@ -184,7 +184,8 @@ static enum state ansi_one_g3(H3270 *, int, int); |
184 | 184 | static enum state ansi_multibyte(H3270 *, int, int); |
185 | 185 | |
186 | 186 | typedef enum state (*afn_t)(H3270 *, int, int); |
187 | -static afn_t ansi_fn[] = { | |
187 | + | |
188 | +static const afn_t ansi_fn[] = { | |
188 | 189 | /* 0 */ &ansi_data_mode, |
189 | 190 | /* 1 */ &dec_save_cursor, |
190 | 191 | /* 2 */ &dec_restore_cursor, |
... | ... | @@ -243,7 +244,7 @@ static afn_t ansi_fn[] = { |
243 | 244 | /* 55 */ &ansi_multibyte, |
244 | 245 | }; |
245 | 246 | |
246 | -static unsigned char st[8][256] = { | |
247 | +static const unsigned char st[8][256] = { | |
247 | 248 | /* |
248 | 249 | * State table for base processing (state == DATA) |
249 | 250 | */ |
... | ... | @@ -439,7 +440,7 @@ static unsigned char st[8][256] = { |
439 | 440 | #define CSD_UK 1 |
440 | 441 | #define CSD_US 2 |
441 | 442 | |
442 | -static int saved_cursor = 0; | |
443 | +// static int saved_cursor = 0; | |
443 | 444 | #define NN 20 |
444 | 445 | static int n[NN], nx = 0; |
445 | 446 | #define NT 256 |
... | ... | @@ -456,25 +457,27 @@ static int cset = CS_G0; |
456 | 457 | static int saved_cset = CS_G0; |
457 | 458 | static int csd[4] = { CSD_US, CSD_US, CSD_US, CSD_US }; |
458 | 459 | static int saved_csd[4] = { CSD_US, CSD_US, CSD_US, CSD_US }; |
459 | -static int once_cset = -1; | |
460 | -static int insert_mode = 0; | |
461 | -static int auto_newline_mode = 0; | |
462 | -static int appl_cursor = 0; | |
463 | -static int saved_appl_cursor = 0; | |
464 | -static int wraparound_mode = 1; | |
465 | -static int saved_wraparound_mode = 1; | |
466 | -static int rev_wraparound_mode = 0; | |
467 | -static int saved_rev_wraparound_mode = 0; | |
468 | -static int allow_wide_mode = 0; | |
469 | -static int saved_allow_wide_mode = 0; | |
470 | -static int wide_mode = 0; | |
471 | -static int saved_wide_mode = 0; | |
472 | -static Boolean saved_altbuffer = False; | |
473 | -static int scroll_top = -1; | |
474 | -static int scroll_bottom = -1; | |
460 | +// static int once_cset = -1; | |
461 | +// static int insert_mode = 0; | |
462 | +// static int auto_newline_mode = 0; | |
463 | +// static int appl_cursor = 0; | |
464 | +// static int saved_appl_cursor = 0; | |
465 | +//static int wraparound_mode = 1; | |
466 | +// static int saved_wraparound_mode = 1; | |
467 | +// static int rev_wraparound_mode = 0; | |
468 | +// static int saved_rev_wraparound_mode = 0; | |
469 | +// static int allow_wide_mode = 0; | |
470 | +// static int saved_allow_wide_mode = 0; | |
471 | +// static int wide_mode = 0; | |
472 | +// static int saved_wide_mode = 0; | |
473 | +// static Boolean saved_altbuffer = False; | |
474 | +// static int scroll_top = -1; | |
475 | +// static int scroll_bottom = -1; | |
475 | 476 | static unsigned char *tabs = (unsigned char *) NULL; |
476 | -static char gnnames[] = "()*+"; | |
477 | -static char csnames[] = "0AB"; | |
477 | + | |
478 | +static const char gnnames[] = "()*+"; | |
479 | +static const char csnames[] = "0AB"; | |
480 | + | |
478 | 481 | static int cs_to_change; |
479 | 482 | #if defined(X3270_DBCS) /*[*/ |
480 | 483 | static unsigned char mb_pending = 0; |
... | ... | @@ -484,9 +487,9 @@ static int dbcs_process(int ch, unsigned char ebc[]); |
484 | 487 | static int pmi = 0; |
485 | 488 | static char pending_mbs[MB_MAX]; |
486 | 489 | |
487 | -static Boolean held_wrap = False; | |
490 | +// static Boolean held_wrap = False; | |
488 | 491 | |
489 | -static void ansi_scroll(void); | |
492 | +static void ansi_scroll(H3270 *hSession); | |
490 | 493 | |
491 | 494 | static enum state |
492 | 495 | ansi_data_mode(H3270 *hSession, int ig1 unused, int ig2 unused) |
... | ... | @@ -499,7 +502,7 @@ dec_save_cursor(H3270 *hSession, int ig1 unused, int ig2 unused) |
499 | 502 | { |
500 | 503 | int i; |
501 | 504 | |
502 | - saved_cursor = h3270.cursor_addr; | |
505 | + hSession->saved_cursor = hSession->cursor_addr; | |
503 | 506 | saved_cset = cset; |
504 | 507 | for (i = 0; i < 4; i++) |
505 | 508 | saved_csd[i] = csd[i]; |
... | ... | @@ -509,8 +512,7 @@ dec_save_cursor(H3270 *hSession, int ig1 unused, int ig2 unused) |
509 | 512 | return DATA; |
510 | 513 | } |
511 | 514 | |
512 | -static enum state | |
513 | -dec_restore_cursor(H3270 *hSession, int ig1 unused, int ig2 unused) | |
515 | +static enum state dec_restore_cursor(H3270 *hSession, int ig1 unused, int ig2 unused) | |
514 | 516 | { |
515 | 517 | int i; |
516 | 518 | |
... | ... | @@ -520,23 +522,24 @@ dec_restore_cursor(H3270 *hSession, int ig1 unused, int ig2 unused) |
520 | 522 | fg = saved_fg; |
521 | 523 | bg = saved_bg; |
522 | 524 | gr = saved_gr; |
523 | - cursor_move(&h3270,saved_cursor); | |
524 | - held_wrap = False; | |
525 | + cursor_move(hSession,hSession->saved_cursor); | |
526 | + hSession->held_wrap = 0; | |
525 | 527 | return DATA; |
526 | 528 | } |
527 | 529 | |
528 | -static enum state | |
529 | -ansi_newline(H3270 *hSession, int ig1 unused, int ig2 unused) | |
530 | +static enum state ansi_newline(H3270 *hSession, int ig1 unused, int ig2 unused) | |
530 | 531 | { |
531 | 532 | int nc; |
532 | 533 | |
533 | - cursor_move(&h3270,h3270.cursor_addr - (h3270.cursor_addr % h3270.cols)); | |
534 | - nc = h3270.cursor_addr + h3270.cols; | |
535 | - if (nc < scroll_bottom * h3270.cols) | |
536 | - cursor_move(&h3270,nc); | |
534 | + cursor_move(hSession,hSession->cursor_addr - (hSession->cursor_addr % hSession->cols)); | |
535 | + nc = hSession->cursor_addr + hSession->cols; | |
536 | + | |
537 | + if (nc < hSession->scroll_bottom * hSession->cols) | |
538 | + cursor_move(hSession,nc); | |
537 | 539 | else |
538 | - ansi_scroll(); | |
539 | - held_wrap = False; | |
540 | + ansi_scroll(hSession); | |
541 | + | |
542 | + hSession->held_wrap = 0; | |
540 | 543 | return DATA; |
541 | 544 | } |
542 | 545 | |
... | ... | @@ -552,7 +555,7 @@ ansi_cursor_up(H3270 *hSession, int nn, int ig2 unused) |
552 | 555 | cursor_move(&h3270, h3270.cursor_addr % h3270.cols); |
553 | 556 | else |
554 | 557 | cursor_move(&h3270, h3270.cursor_addr - (nn * h3270.cols)); |
555 | - held_wrap = False; | |
558 | + hSession->held_wrap = 0; | |
556 | 559 | return DATA; |
557 | 560 | } |
558 | 561 | |
... | ... | @@ -583,27 +586,30 @@ ansi_reset(H3270 *hSession, int ig1 unused, int ig2 unused) |
583 | 586 | saved_cset = CS_G0; |
584 | 587 | csd[0] = csd[1] = csd[2] = csd[3] = CSD_US; |
585 | 588 | saved_csd[0] = saved_csd[1] = saved_csd[2] = saved_csd[3] = CSD_US; |
586 | - once_cset = -1; | |
587 | - saved_cursor = 0; | |
588 | - insert_mode = 0; | |
589 | - auto_newline_mode = 0; | |
590 | - appl_cursor = 0; | |
591 | - saved_appl_cursor = 0; | |
592 | - wraparound_mode = 1; | |
593 | - saved_wraparound_mode = 1; | |
594 | - rev_wraparound_mode = 0; | |
595 | - saved_rev_wraparound_mode = 0; | |
596 | - allow_wide_mode = 0; | |
597 | - saved_allow_wide_mode = 0; | |
598 | - wide_mode = 0; | |
599 | - allow_wide_mode = 0; | |
600 | - saved_altbuffer = False; | |
601 | - scroll_top = 1; | |
602 | - scroll_bottom = h3270.rows; | |
589 | + hSession->once_cset = -1; | |
590 | + hSession->saved_cursor = 0; | |
591 | + hSession->insert_mode = 0; | |
592 | + hSession->auto_newline_mode = 0; | |
593 | + hSession->appl_cursor = 0; | |
594 | + hSession->saved_appl_cursor = 0; | |
595 | + hSession->wraparound_mode = 1; | |
596 | + hSession->saved_wraparound_mode = 1; | |
597 | + hSession->rev_wraparound_mode = 0; | |
598 | + hSession->saved_rev_wraparound_mode = 0; | |
599 | + hSession->allow_wide_mode = 0; | |
600 | +// allow_wide_mode = 0; | |
601 | + | |
602 | + hSession->saved_allow_wide_mode = 0; | |
603 | + hSession->wide_mode = 0; | |
604 | + hSession->saved_altbuffer = 0; | |
605 | + | |
606 | + hSession->scroll_top = 1; | |
607 | + hSession->scroll_bottom = hSession->rows; | |
608 | + | |
603 | 609 | Replace(tabs, (unsigned char *)lib3270_malloc((h3270.cols+7)/8)); |
604 | 610 | for (i = 0; i < (h3270.cols+7)/8; i++) |
605 | 611 | tabs[i] = 0x01; |
606 | - held_wrap = False; | |
612 | + hSession->held_wrap = 0; | |
607 | 613 | if (!first) { |
608 | 614 | ctlr_altbuffer(&h3270,True); |
609 | 615 | ctlr_aclear(&h3270, 0, h3270.rows * h3270.cols, 1); |
... | ... | @@ -650,7 +656,7 @@ ansi_cursor_down(H3270 *hSession, int nn, int ig2 unused) |
650 | 656 | cursor_move(&h3270,(h3270.cols-1)*h3270.cols + (h3270.cursor_addr%h3270.cols)); |
651 | 657 | else |
652 | 658 | cursor_move(&h3270,h3270.cursor_addr + (nn * h3270.cols)); |
653 | - held_wrap = False; | |
659 | + hSession->held_wrap = 0; | |
654 | 660 | return DATA; |
655 | 661 | } |
656 | 662 | |
... | ... | @@ -667,7 +673,7 @@ ansi_cursor_right(H3270 *hSession, int nn, int ig2 unused) |
667 | 673 | if (cc + nn >= h3270.cols) |
668 | 674 | nn = h3270.cols - 1 - cc; |
669 | 675 | cursor_move(&h3270,h3270.cursor_addr + nn); |
670 | - held_wrap = False; | |
676 | + hSession->held_wrap = 0; | |
671 | 677 | return DATA; |
672 | 678 | } |
673 | 679 | |
... | ... | @@ -676,18 +682,19 @@ ansi_cursor_left(H3270 *hSession, int nn, int ig2 unused) |
676 | 682 | { |
677 | 683 | int cc; |
678 | 684 | |
679 | - if (held_wrap) { | |
680 | - held_wrap = False; | |
685 | + if (hSession->held_wrap) | |
686 | + { | |
687 | + hSession->held_wrap = 0; | |
681 | 688 | return DATA; |
682 | 689 | } |
683 | 690 | if (nn < 1) |
684 | 691 | nn = 1; |
685 | - cc = h3270.cursor_addr % h3270.cols; | |
692 | + cc = hSession->cursor_addr % hSession->cols; | |
686 | 693 | if (!cc) |
687 | 694 | return DATA; |
688 | 695 | if (nn > cc) |
689 | 696 | nn = cc; |
690 | - cursor_move(&h3270,h3270.cursor_addr - nn); | |
697 | + cursor_move(hSession,hSession->cursor_addr - nn); | |
691 | 698 | return DATA; |
692 | 699 | } |
693 | 700 | |
... | ... | @@ -695,11 +702,11 @@ static enum state |
695 | 702 | ansi_cursor_motion(H3270 *hSession, int n1, int n2) |
696 | 703 | { |
697 | 704 | if (n1 < 1) n1 = 1; |
698 | - if (n1 > h3270.rows) n1 = h3270.rows; | |
705 | + if (n1 > hSession->rows) n1 = hSession->rows; | |
699 | 706 | if (n2 < 1) n2 = 1; |
700 | - if (n2 > h3270.cols) n2 = h3270.cols; | |
701 | - cursor_move(&h3270,(n1 - 1) * h3270.cols + (n2 - 1)); | |
702 | - held_wrap = False; | |
707 | + if (n2 > hSession->cols) n2 = hSession->cols; | |
708 | + cursor_move(hSession,(n1 - 1) * hSession->cols + (n2 - 1)); | |
709 | + hSession->held_wrap = 0; | |
703 | 710 | return DATA; |
704 | 711 | } |
705 | 712 | |
... | ... | @@ -744,11 +751,11 @@ static enum state |
744 | 751 | ansi_insert_lines(H3270 *hSession, int nn, int ig2 unused) |
745 | 752 | { |
746 | 753 | int rr = h3270.cursor_addr / h3270.cols; /* current row */ |
747 | - int mr = scroll_bottom - rr; /* rows left at and below this one */ | |
748 | - int ns; /* rows that are shifting */ | |
754 | + int mr = hSession->scroll_bottom - rr; /* rows left at and below this one */ | |
755 | + int ns; /* rows that are shifting */ | |
749 | 756 | |
750 | 757 | /* If outside of the scrolling region, do nothing */ |
751 | - if (rr < scroll_top - 1 || rr >= scroll_bottom) | |
758 | + if (rr < hSession->scroll_top - 1 || rr >= hSession->scroll_bottom) | |
752 | 759 | return DATA; |
753 | 760 | |
754 | 761 | if (nn < 1) |
... | ... | @@ -769,12 +776,12 @@ ansi_insert_lines(H3270 *hSession, int nn, int ig2 unused) |
769 | 776 | static enum state |
770 | 777 | ansi_delete_lines(H3270 *hSession, int nn, int ig2 unused) |
771 | 778 | { |
772 | - int rr = h3270.cursor_addr / h3270.cols; /* current row */ | |
773 | - int mr = scroll_bottom - rr; /* max rows that can be deleted */ | |
774 | - int ns; /* rows that are shifting */ | |
779 | + int rr = hSession->cursor_addr / hSession->cols; /* current row */ | |
780 | + int mr = hSession->scroll_bottom - rr; /* max rows that can be deleted */ | |
781 | + int ns; /* rows that are shifting */ | |
775 | 782 | |
776 | 783 | /* If outside of the scrolling region, do nothing */ |
777 | - if (rr < scroll_top - 1 || rr >= scroll_bottom) | |
784 | + if (rr < hSession->scroll_top - 1 || rr >= hSession->scroll_bottom) | |
778 | 785 | return DATA; |
779 | 786 | |
780 | 787 | if (nn < 1) |
... | ... | @@ -785,19 +792,19 @@ ansi_delete_lines(H3270 *hSession, int nn, int ig2 unused) |
785 | 792 | /* Move the surviving rows up */ |
786 | 793 | ns = mr - nn; |
787 | 794 | if (ns) |
788 | - ctlr_bcopy((rr + nn) * h3270.cols, rr * h3270.cols, ns * h3270.cols, 1); | |
795 | + ctlr_bcopy((rr + nn) * hSession->cols, rr * hSession->cols, ns * hSession->cols, 1); | |
789 | 796 | |
790 | 797 | /* Clear the rest of the screen */ |
791 | - ctlr_aclear(&h3270, (rr + ns) * h3270.cols, nn * h3270.cols, 1); | |
798 | + ctlr_aclear(hSession, (rr + ns) * hSession->cols, nn * hSession->cols, 1); | |
792 | 799 | return DATA; |
793 | 800 | } |
794 | 801 | |
795 | 802 | static enum state |
796 | 803 | ansi_delete_chars(H3270 *hSession, int nn, int ig2 unused) |
797 | 804 | { |
798 | - int cc = h3270.cursor_addr % h3270.cols; /* current col */ | |
799 | - int mc = h3270.cols - cc; /* max chars that can be deleted */ | |
800 | - int ns; /* chars that are shifting */ | |
805 | + int cc = hSession->cursor_addr % hSession->cols; /* current col */ | |
806 | + int mc = hSession->cols - cc; /* max chars that can be deleted */ | |
807 | + int ns; /* chars that are shifting */ | |
801 | 808 | |
802 | 809 | if (nn < 1) |
803 | 810 | nn = 1; |
... | ... | @@ -807,10 +814,10 @@ ansi_delete_chars(H3270 *hSession, int nn, int ig2 unused) |
807 | 814 | /* Move the surviving chars left */ |
808 | 815 | ns = mc - nn; |
809 | 816 | if (ns) |
810 | - ctlr_bcopy(h3270.cursor_addr + nn, h3270.cursor_addr, ns, 1); | |
817 | + ctlr_bcopy(hSession->cursor_addr + nn, hSession->cursor_addr, ns, 1); | |
811 | 818 | |
812 | 819 | /* Clear the end of the line */ |
813 | - ctlr_aclear(&h3270, h3270.cursor_addr + ns, nn, 1); | |
820 | + ctlr_aclear(hSession, hSession->cursor_addr + ns, nn, 1); | |
814 | 821 | return DATA; |
815 | 822 | } |
816 | 823 | |
... | ... | @@ -920,26 +927,29 @@ ansi_bell(H3270 *hSession, int ig1 unused, int ig2 unused) |
920 | 927 | return DATA; |
921 | 928 | } |
922 | 929 | |
923 | -static enum state | |
924 | -ansi_newpage(H3270 *hSession, int ig1 unused, int ig2 unused) | |
930 | +static enum state ansi_newpage(H3270 *hSession, int ig1 unused, int ig2 unused) | |
925 | 931 | { |
926 | 932 | ctlr_clear(&h3270,False); |
927 | 933 | return DATA; |
928 | 934 | } |
929 | 935 | |
930 | -static enum state | |
931 | -ansi_backspace(H3270 *hSession, int ig1 unused, int ig2 unused) | |
936 | +static enum state ansi_backspace(H3270 *hSession, int ig1 unused, int ig2 unused) | |
932 | 937 | { |
933 | - if (held_wrap) { | |
934 | - held_wrap = False; | |
938 | + if (hSession->held_wrap) | |
939 | + { | |
940 | + hSession->held_wrap = 0; | |
935 | 941 | return DATA; |
936 | 942 | } |
937 | - if (rev_wraparound_mode) { | |
938 | - if (h3270.cursor_addr > (scroll_top - 1) * h3270.cols) | |
939 | - cursor_move(&h3270,h3270.cursor_addr - 1); | |
940 | - } else { | |
941 | - if (h3270.cursor_addr % h3270.cols) | |
942 | - cursor_move(&h3270,h3270.cursor_addr - 1); | |
943 | + | |
944 | + if (hSession->rev_wraparound_mode) | |
945 | + { | |
946 | + if (hSession->cursor_addr > (hSession->scroll_top - 1) * hSession->cols) | |
947 | + cursor_move(hSession,hSession->cursor_addr - 1); | |
948 | + } | |
949 | + else | |
950 | + { | |
951 | + if (hSession->cursor_addr % hSession->cols) | |
952 | + cursor_move(hSession,hSession->cursor_addr - 1); | |
943 | 953 | } |
944 | 954 | return DATA; |
945 | 955 | } |
... | ... | @@ -947,48 +957,51 @@ ansi_backspace(H3270 *hSession, int ig1 unused, int ig2 unused) |
947 | 957 | static enum state |
948 | 958 | ansi_cr(H3270 *hSession, int ig1 unused, int ig2 unused) |
949 | 959 | { |
950 | - if (h3270.cursor_addr % h3270.cols) | |
951 | - cursor_move(&h3270,h3270.cursor_addr - (h3270.cursor_addr % h3270.cols)); | |
952 | - if (auto_newline_mode) | |
960 | + if (hSession->cursor_addr % hSession->cols) | |
961 | + cursor_move(hSession,hSession->cursor_addr - (hSession->cursor_addr % hSession->cols)); | |
962 | + | |
963 | + if (hSession->auto_newline_mode) | |
953 | 964 | (void) ansi_lf(hSession, 0, 0); |
954 | - held_wrap = False; | |
965 | + | |
966 | + hSession->held_wrap = 0; | |
955 | 967 | return DATA; |
956 | 968 | } |
957 | 969 | |
958 | 970 | static enum state |
959 | 971 | ansi_lf(H3270 *hSession, int ig1 unused, int ig2 unused) |
960 | 972 | { |
961 | - int nc = h3270.cursor_addr + h3270.cols; | |
973 | + int nc = hSession->cursor_addr + hSession->cols; | |
962 | 974 | |
963 | - held_wrap = False; | |
975 | + hSession->held_wrap = 0; | |
964 | 976 | |
965 | 977 | /* If we're below the scrolling region, don't scroll. */ |
966 | - if ((h3270.cursor_addr / h3270.cols) >= scroll_bottom) { | |
967 | - if (nc < h3270.rows * h3270.cols) | |
968 | - cursor_move(&h3270,nc); | |
978 | + if((hSession->cursor_addr / hSession->cols) >= hSession->scroll_bottom) | |
979 | + { | |
980 | + if (nc < hSession->rows * hSession->cols) | |
981 | + cursor_move(hSession,nc); | |
969 | 982 | return DATA; |
970 | 983 | } |
971 | 984 | |
972 | - if (nc < scroll_bottom * h3270.cols) | |
973 | - cursor_move(&h3270,nc); | |
985 | + if (nc < hSession->scroll_bottom * hSession->cols) | |
986 | + cursor_move(hSession,nc); | |
974 | 987 | else |
975 | - ansi_scroll(); | |
988 | + ansi_scroll(hSession); | |
976 | 989 | return DATA; |
977 | 990 | } |
978 | 991 | |
979 | 992 | static enum state |
980 | 993 | ansi_htab(H3270 *hSession, int ig1 unused, int ig2 unused) |
981 | 994 | { |
982 | - int col = h3270.cursor_addr % h3270.cols; | |
995 | + int col = hSession->cursor_addr % hSession->cols; | |
983 | 996 | int i; |
984 | 997 | |
985 | - held_wrap = False; | |
986 | - if (col == h3270.cols-1) | |
998 | + hSession->held_wrap = 0; | |
999 | + if (col == hSession->cols-1) | |
987 | 1000 | return DATA; |
988 | - for (i = col+1; i < h3270.cols-1; i++) | |
1001 | + for (i = col+1; i < hSession->cols-1; i++) | |
989 | 1002 | if (tabs[i/8] & 1<<(i%8)) |
990 | 1003 | break; |
991 | - cursor_move(&h3270,h3270.cursor_addr - col + i); | |
1004 | + cursor_move(hSession,hSession->cursor_addr - col + i); | |
992 | 1005 | return DATA; |
993 | 1006 | } |
994 | 1007 | |
... | ... | @@ -1006,13 +1019,13 @@ ansi_nop(H3270 *hSession, int ig1 unused, int ig2 unused) |
1006 | 1019 | |
1007 | 1020 | #define PWRAP { \ |
1008 | 1021 | nc = h3270.cursor_addr + 1; \ |
1009 | - if (nc < scroll_bottom * h3270.cols) \ | |
1022 | + if (nc < h3270.scroll_bottom * h3270.cols) \ | |
1010 | 1023 | cursor_move(&h3270,nc); \ |
1011 | 1024 | else { \ |
1012 | - if (h3270.cursor_addr / h3270.cols >= scroll_bottom) \ | |
1025 | + if (h3270.cursor_addr / h3270.cols >= h3270.scroll_bottom) \ | |
1013 | 1026 | cursor_move(&h3270,h3270.cursor_addr / h3270.cols * h3270.cols); \ |
1014 | 1027 | else { \ |
1015 | - ansi_scroll(); \ | |
1028 | + ansi_scroll(&h3270); \ | |
1016 | 1029 | cursor_move(&h3270,nc - h3270.cols); \ |
1017 | 1030 | } \ |
1018 | 1031 | } \ |
... | ... | @@ -1059,14 +1072,16 @@ ansi_printing(H3270 *hSession, int ig1 unused, int ig2 unused) |
1059 | 1072 | } |
1060 | 1073 | pmi = 0; |
1061 | 1074 | |
1062 | - if (held_wrap) { | |
1075 | + if (hSession->held_wrap) | |
1076 | + { | |
1063 | 1077 | PWRAP; |
1064 | - held_wrap = False; | |
1078 | + hSession->held_wrap = 0; | |
1065 | 1079 | } |
1066 | 1080 | |
1067 | - if (insert_mode) | |
1081 | + if (hSession->insert_mode) | |
1068 | 1082 | (void) ansi_insert_chars(hSession,1, 0); |
1069 | - switch (csd[(once_cset != -1) ? once_cset : cset]) { | |
1083 | + | |
1084 | + switch (csd[(hSession->once_cset != -1) ? hSession->once_cset : cset]) { | |
1070 | 1085 | case CSD_LD: /* line drawing "0" */ |
1071 | 1086 | if (ansi_ch >= 0x5f && ansi_ch <= 0x7e) |
1072 | 1087 | ctlr_add(&h3270,h3270.cursor_addr, (unsigned char)(ansi_ch - 0x5f),CS_LINEDRAW); |
... | ... | @@ -1110,7 +1125,7 @@ ansi_printing(H3270 *hSession, int ig1 unused, int ig2 unused) |
1110 | 1125 | ctlr_add_bg(cursor_addr, bg); |
1111 | 1126 | if (wraparound_mode) { |
1112 | 1127 | if (!((cursor_addr + 1) % COLS)) { |
1113 | - held_wrap = True; | |
1128 | + held_wrap = 1; | |
1114 | 1129 | } else { |
1115 | 1130 | PWRAP; |
1116 | 1131 | } |
... | ... | @@ -1155,18 +1170,18 @@ ansi_printing(H3270 *hSession, int ig1 unused, int ig2 unused) |
1155 | 1170 | ea_buf[cursor_addr].db = DBCS_NONE; |
1156 | 1171 | } |
1157 | 1172 | #endif /*]*/ |
1158 | - ctlr_add(&h3270,h3270.cursor_addr, ebc_ch, default_cs); | |
1173 | + ctlr_add(hSession,hSession->cursor_addr, ebc_ch, default_cs); | |
1159 | 1174 | #if defined(X3270_DBCS) /*[*/ |
1160 | 1175 | if (default_cs == CS_DBCS) |
1161 | 1176 | (void) ctlr_dbcs_postprocess(); |
1162 | 1177 | #endif /*]*/ |
1163 | 1178 | break; |
1164 | 1179 | } |
1165 | - once_cset = -1; | |
1166 | - ctlr_add_gr(&h3270,h3270.cursor_addr, gr); | |
1167 | - ctlr_add_fg(&h3270,h3270.cursor_addr, fg); | |
1168 | - ctlr_add_bg(&h3270,h3270.cursor_addr, bg); | |
1169 | - if (wraparound_mode) { | |
1180 | + hSession->once_cset = -1; | |
1181 | + ctlr_add_gr(hSession,hSession->cursor_addr, gr); | |
1182 | + ctlr_add_fg(hSession,hSession->cursor_addr, fg); | |
1183 | + ctlr_add_bg(hSession,hSession->cursor_addr, bg); | |
1184 | + if (hSession->wraparound_mode) { | |
1170 | 1185 | /* |
1171 | 1186 | * There is a fascinating behavior of xterm which we will |
1172 | 1187 | * attempt to emulate here. When a character is printed in the |
... | ... | @@ -1180,14 +1195,14 @@ ansi_printing(H3270 *hSession, int ig1 unused, int ig2 unused) |
1180 | 1195 | * In my opinion, very strange, but among other things, 'vi' |
1181 | 1196 | * depends on it! |
1182 | 1197 | */ |
1183 | - if (!((h3270.cursor_addr + 1) % h3270.cols)) { | |
1184 | - held_wrap = True; | |
1198 | + if (!((hSession->cursor_addr + 1) % hSession->cols)) { | |
1199 | + hSession->held_wrap = 1; | |
1185 | 1200 | } else { |
1186 | 1201 | PWRAP; |
1187 | 1202 | } |
1188 | 1203 | } else { |
1189 | - if ((h3270.cursor_addr % h3270.cols) != (h3270.cols - 1)) | |
1190 | - cursor_move(&h3270,h3270.cursor_addr + 1); | |
1204 | + if ((hSession->cursor_addr % hSession->cols) != (hSession->cols - 1)) | |
1205 | + cursor_move(hSession,hSession->cursor_addr + 1); | |
1191 | 1206 | } |
1192 | 1207 | return DATA; |
1193 | 1208 | } |
... | ... | @@ -1257,13 +1272,12 @@ ansi_digit(H3270 *hSession, int ig1 unused, int ig2 unused) |
1257 | 1272 | static enum state |
1258 | 1273 | ansi_reverse_index(H3270 *hSession, int ig1 unused, int ig2 unused) |
1259 | 1274 | { |
1260 | - int rr = h3270.cursor_addr / h3270.cols; /* current row */ | |
1261 | - int np = (scroll_top - 1) - rr; /* number of rows in the scrolling | |
1262 | - region, above this line */ | |
1263 | - int ns; /* number of rows to scroll */ | |
1264 | - int nn = 1; /* number of rows to index */ | |
1275 | + int rr = hSession->cursor_addr / hSession->cols; /* current row */ | |
1276 | + int np = (hSession->scroll_top - 1) - rr; /* number of rows in the scrolling region, above this line */ | |
1277 | + int ns; /* number of rows to scroll */ | |
1278 | + int nn = 1; /* number of rows to index */ | |
1265 | 1279 | |
1266 | - held_wrap = False; | |
1280 | + hSession->held_wrap = 0; | |
1267 | 1281 | |
1268 | 1282 | /* If the cursor is above the scrolling region, do a simple margined |
1269 | 1283 | cursor up. */ |
... | ... | @@ -1307,12 +1321,13 @@ dec_return_terminal_id(H3270 *hSession, int ig1 unused, int ig2 unused) |
1307 | 1321 | static enum state |
1308 | 1322 | ansi_set_mode(H3270 *hSession, int nn, int ig2 unused) |
1309 | 1323 | { |
1310 | - switch (nn) { | |
1311 | - case 4: | |
1312 | - insert_mode = 1; | |
1324 | + switch (nn) | |
1325 | + { | |
1326 | + case 4: | |
1327 | + hSession->insert_mode = 1; | |
1313 | 1328 | break; |
1314 | - case 20: | |
1315 | - auto_newline_mode = 1; | |
1329 | + case 20: | |
1330 | + hSession->auto_newline_mode = 1; | |
1316 | 1331 | break; |
1317 | 1332 | } |
1318 | 1333 | return DATA; |
... | ... | @@ -1321,12 +1336,13 @@ ansi_set_mode(H3270 *hSession, int nn, int ig2 unused) |
1321 | 1336 | static enum state |
1322 | 1337 | ansi_reset_mode(H3270 *hSession, int nn, int ig2 unused) |
1323 | 1338 | { |
1324 | - switch (nn) { | |
1325 | - case 4: | |
1326 | - insert_mode = 0; | |
1339 | + switch (nn) | |
1340 | + { | |
1341 | + case 4: | |
1342 | + hSession->insert_mode = 0; | |
1327 | 1343 | break; |
1328 | - case 20: | |
1329 | - auto_newline_mode = 0; | |
1344 | + case 20: | |
1345 | + hSession->auto_newline_mode = 0; | |
1330 | 1346 | break; |
1331 | 1347 | } |
1332 | 1348 | return DATA; |
... | ... | @@ -1395,14 +1411,14 @@ ansi_select_g3(H3270 *hSession, int ig1 unused, int ig2 unused) |
1395 | 1411 | static enum state |
1396 | 1412 | ansi_one_g2(H3270 *hSession, int ig1 unused, int ig2 unused) |
1397 | 1413 | { |
1398 | - once_cset = CS_G2; | |
1414 | + hSession->once_cset = CS_G2; | |
1399 | 1415 | return DATA; |
1400 | 1416 | } |
1401 | 1417 | |
1402 | 1418 | static enum state |
1403 | 1419 | ansi_one_g3(H3270 *hSession, int ig1 unused, int ig2 unused) |
1404 | 1420 | { |
1405 | - once_cset = CS_G3; | |
1421 | + hSession->once_cset = CS_G3; | |
1406 | 1422 | return DATA; |
1407 | 1423 | } |
1408 | 1424 | |
... | ... | @@ -1418,30 +1434,32 @@ dec_set(H3270 *hSession, int ig1 unused, int ig2 unused) |
1418 | 1434 | int i; |
1419 | 1435 | |
1420 | 1436 | for (i = 0; i <= nx && i < NN; i++) |
1421 | - switch (n[i]) { | |
1422 | - case 1: /* application cursor keys */ | |
1423 | - appl_cursor = 1; | |
1437 | + switch (n[i]) | |
1438 | + { | |
1439 | + case 1: /* application cursor keys */ | |
1440 | + hSession->appl_cursor = 1; | |
1424 | 1441 | break; |
1425 | - case 2: /* set G0-G3 */ | |
1442 | + case 2: /* set G0-G3 */ | |
1426 | 1443 | csd[0] = csd[1] = csd[2] = csd[3] = CSD_US; |
1427 | 1444 | break; |
1428 | - case 3: /* 132-column mode */ | |
1429 | - if (allow_wide_mode) { | |
1430 | - wide_mode = 1; | |
1445 | + case 3: /* 132-column mode */ | |
1446 | + if (hSession->allow_wide_mode) | |
1447 | + { | |
1448 | + hSession->wide_mode = 1; | |
1431 | 1449 | screen_132(); |
1432 | 1450 | } |
1433 | 1451 | break; |
1434 | - case 7: /* wraparound mode */ | |
1435 | - wraparound_mode = 1; | |
1452 | + case 7: /* wraparound mode */ | |
1453 | + hSession->wraparound_mode = 1; | |
1436 | 1454 | break; |
1437 | - case 40: /* allow 80/132 switching */ | |
1438 | - allow_wide_mode = 1; | |
1455 | + case 40: /* allow 80/132 switching */ | |
1456 | + hSession->allow_wide_mode = 1; | |
1439 | 1457 | break; |
1440 | - case 45: /* reverse-wraparound mode */ | |
1441 | - rev_wraparound_mode = 1; | |
1458 | + case 45: /* reverse-wraparound mode */ | |
1459 | + hSession->rev_wraparound_mode = 1; | |
1442 | 1460 | break; |
1443 | - case 47: /* alt buffer */ | |
1444 | - ctlr_altbuffer(&h3270,True); | |
1461 | + case 47: /* alt buffer */ | |
1462 | + ctlr_altbuffer(hSession,True); | |
1445 | 1463 | break; |
1446 | 1464 | } |
1447 | 1465 | return DATA; |
... | ... | @@ -1453,56 +1471,58 @@ dec_reset(H3270 *hSession, int ig1 unused, int ig2 unused) |
1453 | 1471 | int i; |
1454 | 1472 | |
1455 | 1473 | for (i = 0; i <= nx && i < NN; i++) |
1456 | - switch (n[i]) { | |
1457 | - case 1: /* normal cursor keys */ | |
1458 | - appl_cursor = 0; | |
1474 | + switch (n[i]) | |
1475 | + { | |
1476 | + case 1: /* normal cursor keys */ | |
1477 | + hSession->appl_cursor = 0; | |
1459 | 1478 | break; |
1460 | - case 3: /* 132-column mode */ | |
1461 | - if (allow_wide_mode) { | |
1462 | - wide_mode = 0; | |
1479 | + case 3: /* 132-column mode */ | |
1480 | + if (hSession->allow_wide_mode) | |
1481 | + { | |
1482 | + hSession->wide_mode = 0; | |
1463 | 1483 | screen_80(); |
1464 | 1484 | } |
1465 | 1485 | break; |
1466 | - case 7: /* no wraparound mode */ | |
1467 | - wraparound_mode = 0; | |
1486 | + case 7: /* no wraparound mode */ | |
1487 | + hSession->wraparound_mode = 0; | |
1468 | 1488 | break; |
1469 | - case 40: /* allow 80/132 switching */ | |
1470 | - allow_wide_mode = 0; | |
1489 | + case 40: /* allow 80/132 switching */ | |
1490 | + hSession->allow_wide_mode = 0; | |
1471 | 1491 | break; |
1472 | - case 45: /* no reverse-wraparound mode */ | |
1473 | - rev_wraparound_mode = 0; | |
1492 | + case 45: /* no reverse-wraparound mode */ | |
1493 | + hSession->rev_wraparound_mode = 0; | |
1474 | 1494 | break; |
1475 | - case 47: /* alt buffer */ | |
1476 | - ctlr_altbuffer(&h3270,False); | |
1495 | + case 47: /* alt buffer */ | |
1496 | + ctlr_altbuffer(hSession,False); | |
1477 | 1497 | break; |
1478 | 1498 | } |
1479 | 1499 | return DATA; |
1480 | 1500 | } |
1481 | 1501 | |
1482 | -static enum state | |
1483 | -dec_save(H3270 *hSession, int ig1 unused, int ig2 unused) | |
1502 | +static enum state dec_save(H3270 *hSession, int ig1 unused, int ig2 unused) | |
1484 | 1503 | { |
1485 | 1504 | int i; |
1486 | 1505 | |
1487 | 1506 | for (i = 0; i <= nx && i < NN; i++) |
1488 | - switch (n[i]) { | |
1489 | - case 1: /* application cursor keys */ | |
1490 | - saved_appl_cursor = appl_cursor; | |
1507 | + switch (n[i]) | |
1508 | + { | |
1509 | + case 1: /* application cursor keys */ | |
1510 | + hSession->saved_appl_cursor = hSession->appl_cursor; | |
1491 | 1511 | break; |
1492 | - case 3: /* 132-column mode */ | |
1493 | - saved_wide_mode = wide_mode; | |
1512 | + case 3: /* 132-column mode */ | |
1513 | + hSession->saved_wide_mode = hSession->wide_mode; | |
1494 | 1514 | break; |
1495 | - case 7: /* wraparound mode */ | |
1496 | - saved_wraparound_mode = wraparound_mode; | |
1515 | + case 7: /* wraparound mode */ | |
1516 | + hSession->saved_wraparound_mode = hSession->wraparound_mode; | |
1497 | 1517 | break; |
1498 | - case 40: /* allow 80/132 switching */ | |
1499 | - saved_allow_wide_mode = allow_wide_mode; | |
1518 | + case 40: /* allow 80/132 switching */ | |
1519 | + hSession->saved_allow_wide_mode = hSession->allow_wide_mode; | |
1500 | 1520 | break; |
1501 | - case 45: /* reverse-wraparound mode */ | |
1502 | - saved_rev_wraparound_mode = rev_wraparound_mode; | |
1521 | + case 45: /* reverse-wraparound mode */ | |
1522 | + hSession->saved_rev_wraparound_mode = hSession->rev_wraparound_mode; | |
1503 | 1523 | break; |
1504 | - case 47: /* alt buffer */ | |
1505 | - saved_altbuffer = h3270.is_altbuffer; | |
1524 | + case 47: /* alt buffer */ | |
1525 | + hSession->saved_altbuffer = hSession->is_altbuffer; | |
1506 | 1526 | break; |
1507 | 1527 | } |
1508 | 1528 | return DATA; |
... | ... | @@ -1514,30 +1534,32 @@ dec_restore(H3270 *hSession, int ig1 unused, int ig2 unused) |
1514 | 1534 | int i; |
1515 | 1535 | |
1516 | 1536 | for (i = 0; i <= nx && i < NN; i++) |
1517 | - switch (n[i]) { | |
1518 | - case 1: /* application cursor keys */ | |
1519 | - appl_cursor = saved_appl_cursor; | |
1537 | + switch (n[i]) | |
1538 | + { | |
1539 | + case 1: /* application cursor keys */ | |
1540 | + hSession->appl_cursor = hSession->saved_appl_cursor; | |
1520 | 1541 | break; |
1521 | - case 3: /* 132-column mode */ | |
1522 | - if (allow_wide_mode) { | |
1523 | - wide_mode = saved_wide_mode; | |
1524 | - if (wide_mode) | |
1542 | + case 3: /* 132-column mode */ | |
1543 | + if (hSession->allow_wide_mode) | |
1544 | + { | |
1545 | + hSession->wide_mode = hSession->saved_wide_mode; | |
1546 | + if (hSession->wide_mode) | |
1525 | 1547 | screen_132(); |
1526 | 1548 | else |
1527 | 1549 | screen_80(); |
1528 | 1550 | } |
1529 | 1551 | break; |
1530 | - case 7: /* wraparound mode */ | |
1531 | - wraparound_mode = saved_wraparound_mode; | |
1552 | + case 7: /* wraparound mode */ | |
1553 | + hSession->wraparound_mode = hSession->saved_wraparound_mode; | |
1532 | 1554 | break; |
1533 | - case 40: /* allow 80/132 switching */ | |
1534 | - allow_wide_mode = saved_allow_wide_mode; | |
1555 | + case 40: /* allow 80/132 switching */ | |
1556 | + hSession->allow_wide_mode = hSession->saved_allow_wide_mode; | |
1535 | 1557 | break; |
1536 | - case 45: /* reverse-wraparound mode */ | |
1537 | - rev_wraparound_mode = saved_rev_wraparound_mode; | |
1558 | + case 45: /* reverse-wraparound mode */ | |
1559 | + hSession->rev_wraparound_mode = hSession->saved_rev_wraparound_mode; | |
1538 | 1560 | break; |
1539 | - case 47: /* alt buffer */ | |
1540 | - ctlr_altbuffer(&h3270,saved_altbuffer); | |
1561 | + case 47: /* alt buffer */ | |
1562 | + ctlr_altbuffer(hSession,hSession->saved_altbuffer); | |
1541 | 1563 | break; |
1542 | 1564 | } |
1543 | 1565 | return DATA; |
... | ... | @@ -1548,15 +1570,19 @@ dec_scrolling_region(H3270 *hSession, int top, int bottom) |
1548 | 1570 | { |
1549 | 1571 | if (top < 1) |
1550 | 1572 | top = 1; |
1551 | - if (bottom > h3270.rows) | |
1552 | - bottom = h3270.rows; | |
1553 | - if (top <= bottom && (top > 1 || bottom < h3270.rows)) { | |
1554 | - scroll_top = top; | |
1555 | - scroll_bottom = bottom; | |
1556 | - cursor_move(&h3270,0); | |
1557 | - } else { | |
1558 | - scroll_top = 1; | |
1559 | - scroll_bottom = h3270.rows; | |
1573 | + if (bottom > hSession->rows) | |
1574 | + bottom = hSession->rows; | |
1575 | + | |
1576 | + if (top <= bottom && (top > 1 || bottom < hSession->rows)) | |
1577 | + { | |
1578 | + hSession->scroll_top = top; | |
1579 | + hSession->scroll_bottom = bottom; | |
1580 | + cursor_move(hSession,0); | |
1581 | + } | |
1582 | + else | |
1583 | + { | |
1584 | + hSession->scroll_top = 1; | |
1585 | + hSession->scroll_bottom = hSession->rows; | |
1560 | 1586 | } |
1561 | 1587 | return DATA; |
1562 | 1588 | } |
... | ... | @@ -1631,7 +1657,7 @@ xterm_text_do(H3270 *hSession, int ig1 unused, int ig2 unused) |
1631 | 1657 | static enum state |
1632 | 1658 | ansi_htab_set(H3270 *hSession, int ig1 unused, int ig2 unused) |
1633 | 1659 | { |
1634 | - register int col = h3270.cursor_addr % h3270.cols; | |
1660 | + register int col = hSession->cursor_addr % hSession->cols; | |
1635 | 1661 | |
1636 | 1662 | tabs[col/8] |= 1<<(col%8); |
1637 | 1663 | return DATA; |
... | ... | @@ -1642,13 +1668,14 @@ ansi_htab_clear(H3270 *hSession, int nn, int ig2 unused) |
1642 | 1668 | { |
1643 | 1669 | register int col, i; |
1644 | 1670 | |
1645 | - switch (nn) { | |
1646 | - case 0: | |
1647 | - col = h3270.cursor_addr % h3270.cols; | |
1671 | + switch (nn) | |
1672 | + { | |
1673 | + case 0: | |
1674 | + col = hSession->cursor_addr % hSession->cols; | |
1648 | 1675 | tabs[col/8] &= ~(1<<(col%8)); |
1649 | 1676 | break; |
1650 | - case 3: | |
1651 | - for (i = 0; i < (h3270.cols+7)/8; i++) | |
1677 | + case 3: | |
1678 | + for (i = 0; i < (hSession->cols+7)/8; i++) | |
1652 | 1679 | tabs[i] = 0; |
1653 | 1680 | break; |
1654 | 1681 | } |
... | ... | @@ -1658,29 +1685,28 @@ ansi_htab_clear(H3270 *hSession, int nn, int ig2 unused) |
1658 | 1685 | /* |
1659 | 1686 | * Scroll the screen or the scrolling region. |
1660 | 1687 | */ |
1661 | -static void | |
1662 | -ansi_scroll(void) | |
1688 | +static void ansi_scroll(H3270 *hSession) | |
1663 | 1689 | { |
1664 | - held_wrap = False; | |
1690 | + hSession->held_wrap = 0; | |
1665 | 1691 | |
1666 | 1692 | /* Save the top line */ |
1667 | - if (scroll_top == 1 && scroll_bottom == h3270.rows) | |
1693 | + if (hSession->scroll_top == 1 && hSession->scroll_bottom == hSession->rows) | |
1668 | 1694 | { |
1669 | 1695 | // if (!h3270.is_altbuffer) |
1670 | 1696 | // scroll_save(1, False); |
1671 | - ctlr_scroll(&h3270); | |
1697 | + ctlr_scroll(hSession); | |
1672 | 1698 | return; |
1673 | 1699 | } |
1674 | 1700 | |
1675 | 1701 | /* Scroll all but the last line up */ |
1676 | - if (scroll_bottom > scroll_top) | |
1677 | - ctlr_bcopy(scroll_top * h3270.cols, | |
1678 | - (scroll_top - 1) * h3270.cols, | |
1679 | - (scroll_bottom - scroll_top) * h3270.cols, | |
1702 | + if (hSession->scroll_bottom > hSession->scroll_top) | |
1703 | + ctlr_bcopy(hSession->scroll_top * hSession->cols, | |
1704 | + (hSession->scroll_top - 1) * hSession->cols, | |
1705 | + (hSession->scroll_bottom - hSession->scroll_top) * hSession->cols, | |
1680 | 1706 | 1); |
1681 | 1707 | |
1682 | 1708 | /* Clear the last line */ |
1683 | - ctlr_aclear(&h3270, (scroll_bottom - 1) * h3270.cols, h3270.cols, 1); | |
1709 | + ctlr_aclear(hSession, (hSession->scroll_bottom - 1) * hSession->cols, hSession->cols, 1); | |
1684 | 1710 | } |
1685 | 1711 | |
1686 | 1712 | /* Callback for when we enter ANSI mode. */ |
... | ... | @@ -1707,7 +1733,7 @@ static void trace_pending_mb(void) |
1707 | 1733 | * External entry points |
1708 | 1734 | */ |
1709 | 1735 | void |
1710 | -ansi_process(unsigned int c) | |
1736 | +ansi_process(H3270 *hSession, unsigned int c) | |
1711 | 1737 | { |
1712 | 1738 | afn_t fn; |
1713 | 1739 | |
... | ... | @@ -1717,73 +1743,75 @@ ansi_process(unsigned int c) |
1717 | 1743 | // scroll_to_bottom(); |
1718 | 1744 | |
1719 | 1745 | #if defined(X3270_TRACE) /*[*/ |
1720 | - if (lib3270_get_toggle(&h3270,LIB3270_TOGGLE_SCREEN_TRACE)) | |
1721 | - trace_char(&h3270,(char)c); | |
1746 | + if (lib3270_get_toggle(hSession,LIB3270_TOGGLE_SCREEN_TRACE)) | |
1747 | + trace_char(hSession,(char)c); | |
1722 | 1748 | #endif /*]*/ |
1723 | 1749 | |
1724 | 1750 | fn = ansi_fn[st[(int)state][c]]; |
1751 | + | |
1725 | 1752 | #if defined(X3270_DBCS) /*[*/ |
1726 | 1753 | if (mb_pending && fn != &ansi_printing) |
1727 | 1754 | { |
1728 | - trace_ds(&h3270,"Dropped incomplete multi-byte character"); | |
1755 | + trace_ds(hSession,"Dropped incomplete multi-byte character"); | |
1729 | 1756 | trace_pending_mb(); |
1730 | - trace_ds(&h3270,"\n"); | |
1757 | + trace_ds(hSession,"\n"); | |
1731 | 1758 | mb_pending = 0; |
1732 | 1759 | } |
1733 | 1760 | #endif /*]*/ |
1734 | - state = (*fn)(&h3270, n[0], n[1]); | |
1761 | + | |
1762 | + state = (*fn)(hSession, n[0], n[1]); | |
1735 | 1763 | } |
1736 | 1764 | |
1737 | 1765 | void |
1738 | -ansi_send_up(void) | |
1766 | +ansi_send_up(H3270 *hSession) | |
1739 | 1767 | { |
1740 | - if (appl_cursor) | |
1768 | + if (hSession->appl_cursor) | |
1741 | 1769 | net_sends("\033OA"); |
1742 | 1770 | else |
1743 | 1771 | net_sends("\033[A"); |
1744 | 1772 | } |
1745 | 1773 | |
1746 | 1774 | void |
1747 | -ansi_send_down(void) | |
1775 | +ansi_send_down(H3270 *hSession) | |
1748 | 1776 | { |
1749 | - if (appl_cursor) | |
1777 | + if (hSession->appl_cursor) | |
1750 | 1778 | net_sends("\033OB"); |
1751 | 1779 | else |
1752 | 1780 | net_sends("\033[B"); |
1753 | 1781 | } |
1754 | 1782 | |
1755 | 1783 | void |
1756 | -ansi_send_right(void) | |
1784 | +ansi_send_right(H3270 *hSession) | |
1757 | 1785 | { |
1758 | - if (appl_cursor) | |
1786 | + if (hSession->appl_cursor) | |
1759 | 1787 | net_sends("\033OC"); |
1760 | 1788 | else |
1761 | 1789 | net_sends("\033[C"); |
1762 | 1790 | } |
1763 | 1791 | |
1764 | 1792 | void |
1765 | -ansi_send_left(void) | |
1793 | +ansi_send_left(H3270 *hSession) | |
1766 | 1794 | { |
1767 | - if (appl_cursor) | |
1795 | + if (hSession->appl_cursor) | |
1768 | 1796 | net_sends("\033OD"); |
1769 | 1797 | else |
1770 | 1798 | net_sends("\033[D"); |
1771 | 1799 | } |
1772 | 1800 | |
1773 | 1801 | void |
1774 | -ansi_send_home(void) | |
1802 | +ansi_send_home(H3270 *hSession) | |
1775 | 1803 | { |
1776 | 1804 | net_sends("\033[H"); |
1777 | 1805 | } |
1778 | 1806 | |
1779 | 1807 | void |
1780 | -ansi_send_clear(void) | |
1808 | +ansi_send_clear(H3270 *hSession) | |
1781 | 1809 | { |
1782 | 1810 | net_sends("\033[2K"); |
1783 | 1811 | } |
1784 | 1812 | |
1785 | 1813 | void |
1786 | -ansi_send_pf(int nn) | |
1814 | +ansi_send_pf(H3270 *hSession, int nn) | |
1787 | 1815 | { |
1788 | 1816 | static char fn_buf[6]; |
1789 | 1817 | static int code[] = { |
... | ... | @@ -1809,7 +1837,7 @@ ansi_send_pf(int nn) |
1809 | 1837 | } |
1810 | 1838 | |
1811 | 1839 | void |
1812 | -ansi_send_pa(int nn) | |
1840 | +ansi_send_pa(H3270 *hSession, int nn) | |
1813 | 1841 | { |
1814 | 1842 | static char fn_buf[4]; |
1815 | 1843 | static char code[4] = { 'P', 'Q', 'R', 'S' }; |
... | ... | @@ -1820,12 +1848,12 @@ ansi_send_pa(int nn) |
1820 | 1848 | net_sends(fn_buf); |
1821 | 1849 | } |
1822 | 1850 | |
1823 | -void toggle_lineWrap(H3270 *session, struct lib3270_toggle *t unused, LIB3270_TOGGLE_TYPE type unused) | |
1851 | +void toggle_lineWrap(H3270 *hSession, struct lib3270_toggle *t unused, LIB3270_TOGGLE_TYPE type unused) | |
1824 | 1852 | { |
1825 | - if (lib3270_get_toggle(&h3270,LIB3270_TOGGLE_LINE_WRAP)) | |
1826 | - wraparound_mode = 1; | |
1853 | + if (lib3270_get_toggle(hSession,LIB3270_TOGGLE_LINE_WRAP)) | |
1854 | + hSession->wraparound_mode = 1; | |
1827 | 1855 | else |
1828 | - wraparound_mode = 0; | |
1856 | + hSession->wraparound_mode = 0; | |
1829 | 1857 | } |
1830 | 1858 | |
1831 | 1859 | #if defined(X3270_DBCS) /*[*/ | ... | ... |
src/lib3270/ansic.h
... | ... | @@ -19,15 +19,15 @@ |
19 | 19 | |
20 | 20 | #if defined(X3270_ANSI) /*[*/ |
21 | 21 | |
22 | -LIB3270_INTERNAL void ansi_process(unsigned int c); | |
23 | -LIB3270_INTERNAL void ansi_send_clear(void); | |
24 | -LIB3270_INTERNAL void ansi_send_down(void); | |
25 | -LIB3270_INTERNAL void ansi_send_home(void); | |
26 | -LIB3270_INTERNAL void ansi_send_left(void); | |
27 | -LIB3270_INTERNAL void ansi_send_pa(int nn); | |
28 | -LIB3270_INTERNAL void ansi_send_pf(int nn); | |
29 | -LIB3270_INTERNAL void ansi_send_right(void); | |
30 | -LIB3270_INTERNAL void ansi_send_up(void); | |
22 | +LIB3270_INTERNAL void ansi_process(H3270 *hSession, unsigned int c); | |
23 | +LIB3270_INTERNAL void ansi_send_clear(H3270 *hSession); | |
24 | +LIB3270_INTERNAL void ansi_send_down(H3270 *hSession); | |
25 | +LIB3270_INTERNAL void ansi_send_home(H3270 *hSession); | |
26 | +LIB3270_INTERNAL void ansi_send_left(H3270 *hSession); | |
27 | +LIB3270_INTERNAL void ansi_send_pa(H3270 *hSession, int nn); | |
28 | +LIB3270_INTERNAL void ansi_send_pf(H3270 *hSession, int nn); | |
29 | +LIB3270_INTERNAL void ansi_send_right(H3270 *hSession); | |
30 | +LIB3270_INTERNAL void ansi_send_up(H3270 *hSession); | |
31 | 31 | LIB3270_INTERNAL void ansi_in3270(H3270 *session, int in3270, void *dunno); |
32 | 32 | |
33 | 33 | LIB3270_INTERNAL void toggle_lineWrap(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGGLE_TYPE type); | ... | ... |
src/lib3270/kybd.c
... | ... | @@ -507,12 +507,12 @@ static void key_AID(H3270 *hSession, unsigned char aid_code) |
507 | 507 | } |
508 | 508 | for (i = 0; i < PF_SZ; i++) |
509 | 509 | if (aid_code == pf_xlate[i]) { |
510 | - ansi_send_pf(i+1); | |
510 | + ansi_send_pf(hSession,i+1); | |
511 | 511 | return; |
512 | 512 | } |
513 | 513 | for (i = 0; i < PA_SZ; i++) |
514 | 514 | if (aid_code == pa_xlate[i]) { |
515 | - ansi_send_pa(i+1); | |
515 | + ansi_send_pa(hSession,i+1); | |
516 | 516 | return; |
517 | 517 | } |
518 | 518 | return; |
... | ... | @@ -1186,7 +1186,7 @@ LIB3270_ACTION( firstfield ) |
1186 | 1186 | } |
1187 | 1187 | #if defined(X3270_ANSI) /*[*/ |
1188 | 1188 | if (IN_ANSI) { |
1189 | - ansi_send_home(); | |
1189 | + ansi_send_home(hSession); | |
1190 | 1190 | return 0; |
1191 | 1191 | } |
1192 | 1192 | #endif /*]*/ |
... | ... | @@ -1234,7 +1234,7 @@ LIB3270_CURSOR_ACTION( left ) |
1234 | 1234 | #if defined(X3270_ANSI) /*[*/ |
1235 | 1235 | if (IN_ANSI) |
1236 | 1236 | { |
1237 | - ansi_send_left(); | |
1237 | + ansi_send_left(hSession); | |
1238 | 1238 | return 0; |
1239 | 1239 | } |
1240 | 1240 | #endif /*]*/ |
... | ... | @@ -1503,7 +1503,7 @@ LIB3270_CURSOR_ACTION( right ) |
1503 | 1503 | } |
1504 | 1504 | #if defined(X3270_ANSI) /*[*/ |
1505 | 1505 | if (IN_ANSI) { |
1506 | - ansi_send_right(); | |
1506 | + ansi_send_right(hSession); | |
1507 | 1507 | return 0; |
1508 | 1508 | } |
1509 | 1509 | #endif /*]*/ |
... | ... | @@ -1734,7 +1734,7 @@ LIB3270_CURSOR_ACTION( up ) |
1734 | 1734 | } |
1735 | 1735 | #if defined(X3270_ANSI) /*[*/ |
1736 | 1736 | if (IN_ANSI) { |
1737 | - ansi_send_up(); | |
1737 | + ansi_send_up(hSession); | |
1738 | 1738 | return 0; |
1739 | 1739 | } |
1740 | 1740 | #endif /*]*/ |
... | ... | @@ -1772,7 +1772,7 @@ LIB3270_CURSOR_ACTION( down ) |
1772 | 1772 | #if defined(X3270_ANSI) /*[*/ |
1773 | 1773 | if (IN_ANSI) |
1774 | 1774 | { |
1775 | - ansi_send_down(); | |
1775 | + ansi_send_down(hSession); | |
1776 | 1776 | return 0; |
1777 | 1777 | } |
1778 | 1778 | #endif /*]*/ |
... | ... | @@ -1915,7 +1915,7 @@ LIB3270_ACTION( clear ) |
1915 | 1915 | } |
1916 | 1916 | #if defined(X3270_ANSI) /*[*/ |
1917 | 1917 | if (IN_ANSI) { |
1918 | - ansi_send_clear(); | |
1918 | + ansi_send_clear(hSession); | |
1919 | 1919 | return 0; |
1920 | 1920 | } |
1921 | 1921 | #endif /*]*/ | ... | ... |
src/lib3270/session.c
... | ... | @@ -202,6 +202,12 @@ static void lib3270_session_init(H3270 *hSession, const char *model) |
202 | 202 | hSession->reply_mode = SF_SRM_FIELD; |
203 | 203 | hSession->linemode = 1; |
204 | 204 | hSession->tn3270e_submode = E_NONE; |
205 | + hSession->scroll_top = -1; | |
206 | + hSession->scroll_bottom = -1; | |
207 | + hSession->wraparound_mode = 1; | |
208 | + hSession->saved_wraparound_mode = 1; | |
209 | + hSession->once_cset = -1; | |
210 | + | |
205 | 211 | |
206 | 212 | #ifdef _WIN32 |
207 | 213 | hSession->sockEvent = NULL; | ... | ... |
src/lib3270/telnet.c
... | ... | @@ -1259,8 +1259,8 @@ static int telnet_fsm(H3270 *session, unsigned char c) |
1259 | 1259 | if (!session->syncing) |
1260 | 1260 | { |
1261 | 1261 | if (session->linemode && session->onlcr && c == '\n') |
1262 | - ansi_process((unsigned int) '\r'); | |
1263 | - ansi_process((unsigned int) c); | |
1262 | + ansi_process(session,(unsigned int) '\r'); | |
1263 | + ansi_process(session,(unsigned int) c); | |
1264 | 1264 | // sms_store(c); |
1265 | 1265 | } |
1266 | 1266 | #endif /*]*/ |
... | ... | @@ -1293,7 +1293,7 @@ static int telnet_fsm(H3270 *session, unsigned char c) |
1293 | 1293 | session->ansi_data = 4 + sl; |
1294 | 1294 | } |
1295 | 1295 | trace_dsn(session,"%s",see_chr); |
1296 | - ansi_process((unsigned int) c); | |
1296 | + ansi_process(session,(unsigned int) c); | |
1297 | 1297 | #endif /*]*/ |
1298 | 1298 | } |
1299 | 1299 | else |
... | ... | @@ -1983,7 +1983,7 @@ process_eor(H3270 *hSession) |
1983 | 1983 | hSession->tn3270e_submode = E_NVT; |
1984 | 1984 | check_in3270(hSession); |
1985 | 1985 | for (s = hSession->ibuf; s < hSession->ibptr; s++) { |
1986 | - ansi_process(*s++); | |
1986 | + ansi_process(hSession,*s++); | |
1987 | 1987 | } |
1988 | 1988 | return 0; |
1989 | 1989 | case TN3270E_DT_SSCP_LU_DATA: |
... | ... | @@ -2233,7 +2233,7 @@ static void |
2233 | 2233 | ansi_process_s(const char *data) |
2234 | 2234 | { |
2235 | 2235 | while (*data) |
2236 | - ansi_process((unsigned int) *data++); | |
2236 | + ansi_process(&h3270,(unsigned int) *data++); | |
2237 | 2237 | } |
2238 | 2238 | |
2239 | 2239 | static void forward_data(H3270 *hSession) |
... | ... | @@ -2250,7 +2250,7 @@ static void do_data(H3270 *hSession, char c) |
2250 | 2250 | if (c == '\r') |
2251 | 2251 | *hSession->lbptr++ = '\0'; |
2252 | 2252 | if (c == '\t') |
2253 | - ansi_process((unsigned int) c); | |
2253 | + ansi_process(hSession,(unsigned int) c); | |
2254 | 2254 | else |
2255 | 2255 | ansi_process_s(ctl_see((int) c)); |
2256 | 2256 | } | ... | ... |