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 | } | ... | ... |