Commit 6a4e8342a2efe817d26fcab2cb0ac6f7653f8b8d
1 parent
d61ed387
Exists in
master
and in
3 other branches
Refactoring output buffer management.
Showing
8 changed files
with
251 additions
and
239 deletions
Show diff stats
Makefile.in
| @@ -344,9 +344,9 @@ doc: | @@ -344,9 +344,9 @@ doc: | ||
| 344 | #---[ Debug Targets ]-------------------------------------------------------------------- | 344 | #---[ Debug Targets ]-------------------------------------------------------------------- |
| 345 | 345 | ||
| 346 | Debug: \ | 346 | Debug: \ |
| 347 | - $(BINDBG)/$(LIBNAME)@EXEEXT@ | 347 | + $(BINDBG)/lib3270@EXEEXT@ |
| 348 | 348 | ||
| 349 | -$(BINDBG)/$(LIBNAME)@EXEEXT@: \ | 349 | +$(BINDBG)/lib3270@EXEEXT@: \ |
| 350 | $(foreach SRC, $(basename $(TEST_SOURCES)), $(OBJDBG)/$(SRC).o) \ | 350 | $(foreach SRC, $(basename $(TEST_SOURCES)), $(OBJDBG)/$(SRC).o) \ |
| 351 | $(BINDBG)/$(SONAME) | 351 | $(BINDBG)/$(SONAME) |
| 352 | 352 | ||
| @@ -361,19 +361,19 @@ $(BINDBG)/$(LIBNAME)@EXEEXT@: \ | @@ -361,19 +361,19 @@ $(BINDBG)/$(LIBNAME)@EXEEXT@: \ | ||
| 361 | $(LIBS) | 361 | $(LIBS) |
| 362 | 362 | ||
| 363 | run: \ | 363 | run: \ |
| 364 | - $(BINDBG)/$(LIBNAME)@EXEEXT@ | 364 | + $(BINDBG)/lib3270@EXEEXT@ |
| 365 | 365 | ||
| 366 | ifeq ($(VALGRIND),no) | 366 | ifeq ($(VALGRIND),no) |
| 367 | 367 | ||
| 368 | @LD_LIBRARY_PATH=$(BINDBG) \ | 368 | @LD_LIBRARY_PATH=$(BINDBG) \ |
| 369 | - $(BINDBG)/$(LIBNAME)@EXEEXT@ | 369 | + $(BINDBG)/lib3270@EXEEXT@ |
| 370 | 370 | ||
| 371 | else | 371 | else |
| 372 | @touch valgrind.suppression | 372 | @touch valgrind.suppression |
| 373 | 373 | ||
| 374 | @LD_LIBRARY_PATH=$(BINDBG) \ | 374 | @LD_LIBRARY_PATH=$(BINDBG) \ |
| 375 | $(VALGRIND) --leak-check=full --track-origins=yes --gen-suppressions=all --suppressions=valgrind.suppression \ | 375 | $(VALGRIND) --leak-check=full --track-origins=yes --gen-suppressions=all --suppressions=valgrind.suppression \ |
| 376 | - $(BINDBG)/$(LIBNAME)@EXEEXT@ | 376 | + $(BINDBG)/lib3270@EXEEXT@ |
| 377 | endif | 377 | endif |
| 378 | 378 | ||
| 379 | $(BINDBG)/$(SONAME): \ | 379 | $(BINDBG)/$(SONAME): \ |
src/core/ctlr.c
| @@ -685,9 +685,9 @@ static void insert_sa1(H3270 *hSession, unsigned char attr, unsigned char value, | @@ -685,9 +685,9 @@ static void insert_sa1(H3270 *hSession, unsigned char attr, unsigned char value, | ||
| 685 | return; | 685 | return; |
| 686 | *currentp = value; | 686 | *currentp = value; |
| 687 | space3270out(hSession,3); | 687 | space3270out(hSession,3); |
| 688 | - *hSession->obptr++ = ORDER_SA; | ||
| 689 | - *hSession->obptr++ = attr; | ||
| 690 | - *hSession->obptr++ = value; | 688 | + *hSession->output.ptr++ = ORDER_SA; |
| 689 | + *hSession->output.ptr++ = attr; | ||
| 690 | + *hSession->output.ptr++ = value; | ||
| 691 | if (*anyp) | 691 | if (*anyp) |
| 692 | trace_ds(hSession,"'"); | 692 | trace_ds(hSession,"'"); |
| 693 | trace_ds(hSession, " SetAttribute(%s)", see_efa(attr, value)); | 693 | trace_ds(hSession, " SetAttribute(%s)", see_efa(attr, value)); |
| @@ -763,16 +763,16 @@ void ctlr_read_modified(H3270 *hSession, unsigned char aid_byte, Boolean all) | @@ -763,16 +763,16 @@ void ctlr_read_modified(H3270 *hSession, unsigned char aid_byte, Boolean all) | ||
| 763 | #endif /*]*/ | 763 | #endif /*]*/ |
| 764 | 764 | ||
| 765 | trace_ds(hSession,"> "); | 765 | trace_ds(hSession,"> "); |
| 766 | - hSession->obptr = hSession->obuf; | 766 | + hSession->output.ptr = hSession->output.buf; |
| 767 | 767 | ||
| 768 | switch (aid_byte) | 768 | switch (aid_byte) |
| 769 | { | 769 | { |
| 770 | case AID_SYSREQ: /* test request */ | 770 | case AID_SYSREQ: /* test request */ |
| 771 | space3270out(hSession,4); | 771 | space3270out(hSession,4); |
| 772 | - *hSession->obptr++ = 0x01; /* soh */ | ||
| 773 | - *hSession->obptr++ = 0x5b; /* % */ | ||
| 774 | - *hSession->obptr++ = 0x61; /* / */ | ||
| 775 | - *hSession->obptr++ = 0x02; /* stx */ | 772 | + *hSession->output.ptr++ = 0x01; /* soh */ |
| 773 | + *hSession->output.ptr++ = 0x5b; /* % */ | ||
| 774 | + *hSession->output.ptr++ = 0x61; /* / */ | ||
| 775 | + *hSession->output.ptr++ = 0x02; /* stx */ | ||
| 776 | trace_ds(hSession,"SYSREQ"); | 776 | trace_ds(hSession,"SYSREQ"); |
| 777 | break; | 777 | break; |
| 778 | 778 | ||
| @@ -793,13 +793,13 @@ void ctlr_read_modified(H3270 *hSession, unsigned char aid_byte, Boolean all) | @@ -793,13 +793,13 @@ void ctlr_read_modified(H3270 *hSession, unsigned char aid_byte, Boolean all) | ||
| 793 | if (!IN_SSCP) | 793 | if (!IN_SSCP) |
| 794 | { | 794 | { |
| 795 | space3270out(hSession,3); | 795 | space3270out(hSession,3); |
| 796 | - *hSession->obptr++ = aid_byte; | 796 | + *hSession->output.ptr++ = aid_byte; |
| 797 | trace_ds(hSession,"%s",see_aid(aid_byte)); | 797 | trace_ds(hSession,"%s",see_aid(aid_byte)); |
| 798 | 798 | ||
| 799 | if (short_read) | 799 | if (short_read) |
| 800 | goto rm_done; | 800 | goto rm_done; |
| 801 | 801 | ||
| 802 | - ENCODE_BADDR(hSession->obptr, hSession->cursor_addr); | 802 | + ENCODE_BADDR(hSession->output.ptr, hSession->cursor_addr); |
| 803 | trace_ds(hSession,"%s",rcba(hSession,hSession->cursor_addr)); | 803 | trace_ds(hSession,"%s",rcba(hSession,hSession->cursor_addr)); |
| 804 | } | 804 | } |
| 805 | else | 805 | else |
| @@ -829,8 +829,8 @@ void ctlr_read_modified(H3270 *hSession, unsigned char aid_byte, Boolean all) | @@ -829,8 +829,8 @@ void ctlr_read_modified(H3270 *hSession, unsigned char aid_byte, Boolean all) | ||
| 829 | 829 | ||
| 830 | INC_BA(baddr); | 830 | INC_BA(baddr); |
| 831 | space3270out(hSession,3); | 831 | space3270out(hSession,3); |
| 832 | - *hSession->obptr++ = ORDER_SBA; | ||
| 833 | - ENCODE_BADDR(hSession->obptr, baddr); | 832 | + *hSession->output.ptr++ = ORDER_SBA; |
| 833 | + ENCODE_BADDR(hSession->output.ptr, baddr); | ||
| 834 | trace_ds(hSession," SetBufferAddress%s (Cols: %d Rows: %d)", rcba(hSession,baddr), hSession->view.cols, hSession->view.rows); | 834 | trace_ds(hSession," SetBufferAddress%s (Cols: %d Rows: %d)", rcba(hSession,baddr), hSession->view.cols, hSession->view.rows); |
| 835 | while (!hSession->ea_buf[baddr].fa) | 835 | while (!hSession->ea_buf[baddr].fa) |
| 836 | { | 836 | { |
| @@ -841,14 +841,14 @@ void ctlr_read_modified(H3270 *hSession, unsigned char aid_byte, Boolean all) | @@ -841,14 +841,14 @@ void ctlr_read_modified(H3270 *hSession, unsigned char aid_byte, Boolean all) | ||
| 841 | if (hSession->ea_buf[baddr].cs & CS_GE) | 841 | if (hSession->ea_buf[baddr].cs & CS_GE) |
| 842 | { | 842 | { |
| 843 | space3270out(hSession,1); | 843 | space3270out(hSession,1); |
| 844 | - *hSession->obptr++ = ORDER_GE; | 844 | + *hSession->output.ptr++ = ORDER_GE; |
| 845 | if (any) | 845 | if (any) |
| 846 | trace_ds(hSession,"'"); | 846 | trace_ds(hSession,"'"); |
| 847 | trace_ds(hSession," GraphicEscape"); | 847 | trace_ds(hSession," GraphicEscape"); |
| 848 | any = False; | 848 | any = False; |
| 849 | } | 849 | } |
| 850 | space3270out(hSession,1); | 850 | space3270out(hSession,1); |
| 851 | - *hSession->obptr++ = hSession->ea_buf[baddr].cc; | 851 | + *hSession->output.ptr++ = hSession->ea_buf[baddr].cc; |
| 852 | if (!any) | 852 | if (!any) |
| 853 | trace_ds(hSession," '"); | 853 | trace_ds(hSession," '"); |
| 854 | 854 | ||
| @@ -890,7 +890,7 @@ void ctlr_read_modified(H3270 *hSession, unsigned char aid_byte, Boolean all) | @@ -890,7 +890,7 @@ void ctlr_read_modified(H3270 *hSession, unsigned char aid_byte, Boolean all) | ||
| 890 | if (hSession->ea_buf[baddr].cs & CS_GE) | 890 | if (hSession->ea_buf[baddr].cs & CS_GE) |
| 891 | { | 891 | { |
| 892 | space3270out(hSession,1); | 892 | space3270out(hSession,1); |
| 893 | - *hSession->obptr++ = ORDER_GE; | 893 | + *hSession->output.ptr++ = ORDER_GE; |
| 894 | if (any) | 894 | if (any) |
| 895 | trace_ds(hSession,"' "); | 895 | trace_ds(hSession,"' "); |
| 896 | trace_ds(hSession," GraphicEscape "); | 896 | trace_ds(hSession," GraphicEscape "); |
| @@ -898,7 +898,7 @@ void ctlr_read_modified(H3270 *hSession, unsigned char aid_byte, Boolean all) | @@ -898,7 +898,7 @@ void ctlr_read_modified(H3270 *hSession, unsigned char aid_byte, Boolean all) | ||
| 898 | } | 898 | } |
| 899 | 899 | ||
| 900 | space3270out(hSession,1); | 900 | space3270out(hSession,1); |
| 901 | - *hSession->obptr++ = hSession->ea_buf[baddr].cc; | 901 | + *hSession->output.ptr++ = hSession->ea_buf[baddr].cc; |
| 902 | if (!any) | 902 | if (!any) |
| 903 | trace_ds(hSession,"%s","'"); | 903 | trace_ds(hSession,"%s","'"); |
| 904 | trace_ds(hSession,"%s",see_ebc(hSession, hSession->ea_buf[baddr].cc)); | 904 | trace_ds(hSession,"%s",see_ebc(hSession, hSession->ea_buf[baddr].cc)); |
| @@ -949,11 +949,11 @@ void ctlr_read_buffer(H3270 *hSession, unsigned char aid_byte) | @@ -949,11 +949,11 @@ void ctlr_read_buffer(H3270 *hSession, unsigned char aid_byte) | ||
| 949 | #endif /*]*/ | 949 | #endif /*]*/ |
| 950 | 950 | ||
| 951 | trace_ds(hSession,"> "); | 951 | trace_ds(hSession,"> "); |
| 952 | - hSession->obptr = hSession->obuf; | 952 | + hSession->output.ptr = hSession->output.buf; |
| 953 | 953 | ||
| 954 | space3270out(hSession,3); | 954 | space3270out(hSession,3); |
| 955 | - *hSession->obptr++ = aid_byte; | ||
| 956 | - ENCODE_BADDR(hSession->obptr, hSession->cursor_addr); | 955 | + *hSession->output.ptr++ = aid_byte; |
| 956 | + ENCODE_BADDR(hSession->output.ptr, hSession->cursor_addr); | ||
| 957 | trace_ds(hSession,"%s%s", see_aid(aid_byte), rcba(hSession,hSession->cursor_addr)); | 957 | trace_ds(hSession,"%s%s", see_aid(aid_byte), rcba(hSession,hSession->cursor_addr)); |
| 958 | 958 | ||
| 959 | baddr = 0; | 959 | baddr = 0; |
| @@ -963,18 +963,18 @@ void ctlr_read_buffer(H3270 *hSession, unsigned char aid_byte) | @@ -963,18 +963,18 @@ void ctlr_read_buffer(H3270 *hSession, unsigned char aid_byte) | ||
| 963 | if (hSession->reply_mode == SF_SRM_FIELD) | 963 | if (hSession->reply_mode == SF_SRM_FIELD) |
| 964 | { | 964 | { |
| 965 | space3270out(hSession,2); | 965 | space3270out(hSession,2); |
| 966 | - *hSession->obptr++ = ORDER_SF; | 966 | + *hSession->output.ptr++ = ORDER_SF; |
| 967 | } | 967 | } |
| 968 | else | 968 | else |
| 969 | { | 969 | { |
| 970 | space3270out(hSession,4); | 970 | space3270out(hSession,4); |
| 971 | - *hSession->obptr++ = ORDER_SFE; | ||
| 972 | - attr_count = hSession->obptr - hSession->obuf; | ||
| 973 | - *hSession->obptr++ = 1; /* for now */ | ||
| 974 | - *hSession->obptr++ = XA_3270; | 971 | + *hSession->output.ptr++ = ORDER_SFE; |
| 972 | + attr_count = hSession->output.ptr - hSession->output.buf; | ||
| 973 | + *hSession->output.ptr++ = 1; /* for now */ | ||
| 974 | + *hSession->output.ptr++ = XA_3270; | ||
| 975 | } | 975 | } |
| 976 | fa = hSession->ea_buf[baddr].fa & ~FA_PRINTABLE; | 976 | fa = hSession->ea_buf[baddr].fa & ~FA_PRINTABLE; |
| 977 | - *hSession->obptr++ = code_table[fa]; | 977 | + *hSession->output.ptr++ = code_table[fa]; |
| 978 | 978 | ||
| 979 | if (any) | 979 | if (any) |
| 980 | trace_ds(hSession,"'"); | 980 | trace_ds(hSession,"'"); |
| @@ -986,32 +986,32 @@ void ctlr_read_buffer(H3270 *hSession, unsigned char aid_byte) | @@ -986,32 +986,32 @@ void ctlr_read_buffer(H3270 *hSession, unsigned char aid_byte) | ||
| 986 | { | 986 | { |
| 987 | if (hSession->ea_buf[baddr].fg) { | 987 | if (hSession->ea_buf[baddr].fg) { |
| 988 | space3270out(hSession,2); | 988 | space3270out(hSession,2); |
| 989 | - *hSession->obptr++ = XA_FOREGROUND; | ||
| 990 | - *hSession->obptr++ = hSession->ea_buf[baddr].fg; | 989 | + *hSession->output.ptr++ = XA_FOREGROUND; |
| 990 | + *hSession->output.ptr++ = hSession->ea_buf[baddr].fg; | ||
| 991 | trace_ds(hSession,"%s", see_efa(XA_FOREGROUND, hSession->ea_buf[baddr].fg)); | 991 | trace_ds(hSession,"%s", see_efa(XA_FOREGROUND, hSession->ea_buf[baddr].fg)); |
| 992 | - (*(hSession->obuf + attr_count))++; | 992 | + (*(hSession->output.buf + attr_count))++; |
| 993 | } | 993 | } |
| 994 | if (hSession->ea_buf[baddr].bg) { | 994 | if (hSession->ea_buf[baddr].bg) { |
| 995 | space3270out(hSession,2); | 995 | space3270out(hSession,2); |
| 996 | - *hSession->obptr++ = XA_BACKGROUND; | ||
| 997 | - *hSession->obptr++ = hSession->ea_buf[baddr].bg; | 996 | + *hSession->output.ptr++ = XA_BACKGROUND; |
| 997 | + *hSession->output.ptr++ = hSession->ea_buf[baddr].bg; | ||
| 998 | trace_ds(hSession,"%s", see_efa(XA_BACKGROUND, hSession->ea_buf[baddr].bg)); | 998 | trace_ds(hSession,"%s", see_efa(XA_BACKGROUND, hSession->ea_buf[baddr].bg)); |
| 999 | - (*(hSession->obuf + attr_count))++; | 999 | + (*(hSession->output.buf + attr_count))++; |
| 1000 | } | 1000 | } |
| 1001 | if (hSession->ea_buf[baddr].gr) { | 1001 | if (hSession->ea_buf[baddr].gr) { |
| 1002 | space3270out(hSession,2); | 1002 | space3270out(hSession,2); |
| 1003 | - *hSession->obptr++ = XA_HIGHLIGHTING; | ||
| 1004 | - *hSession->obptr++ = hSession->ea_buf[baddr].gr | 0xf0; | 1003 | + *hSession->output.ptr++ = XA_HIGHLIGHTING; |
| 1004 | + *hSession->output.ptr++ = hSession->ea_buf[baddr].gr | 0xf0; | ||
| 1005 | trace_ds(hSession,"%s", see_efa(XA_HIGHLIGHTING, | 1005 | trace_ds(hSession,"%s", see_efa(XA_HIGHLIGHTING, |
| 1006 | hSession->ea_buf[baddr].gr | 0xf0)); | 1006 | hSession->ea_buf[baddr].gr | 0xf0)); |
| 1007 | - (*(hSession->obuf + attr_count))++; | 1007 | + (*(hSession->output.buf + attr_count))++; |
| 1008 | } | 1008 | } |
| 1009 | if (hSession->ea_buf[baddr].cs & CS_MASK) { | 1009 | if (hSession->ea_buf[baddr].cs & CS_MASK) { |
| 1010 | space3270out(hSession,2); | 1010 | space3270out(hSession,2); |
| 1011 | - *hSession->obptr++ = XA_CHARSET; | ||
| 1012 | - *hSession->obptr++ = host_cs(hSession->ea_buf[baddr].cs); | 1011 | + *hSession->output.ptr++ = XA_CHARSET; |
| 1012 | + *hSession->output.ptr++ = host_cs(hSession->ea_buf[baddr].cs); | ||
| 1013 | trace_ds(hSession,"%s", see_efa(XA_CHARSET,host_cs(hSession->ea_buf[baddr].cs))); | 1013 | trace_ds(hSession,"%s", see_efa(XA_CHARSET,host_cs(hSession->ea_buf[baddr].cs))); |
| 1014 | - (*(hSession->obuf + attr_count))++; | 1014 | + (*(hSession->output.buf + attr_count))++; |
| 1015 | } | 1015 | } |
| 1016 | } | 1016 | } |
| 1017 | any = False; | 1017 | any = False; |
| @@ -1019,14 +1019,14 @@ void ctlr_read_buffer(H3270 *hSession, unsigned char aid_byte) | @@ -1019,14 +1019,14 @@ void ctlr_read_buffer(H3270 *hSession, unsigned char aid_byte) | ||
| 1019 | insert_sa(hSession,baddr,¤t_fg,¤t_bg,¤t_gr,¤t_cs,&any); | 1019 | insert_sa(hSession,baddr,¤t_fg,¤t_bg,¤t_gr,¤t_cs,&any); |
| 1020 | if (hSession->ea_buf[baddr].cs & CS_GE) { | 1020 | if (hSession->ea_buf[baddr].cs & CS_GE) { |
| 1021 | space3270out(hSession,1); | 1021 | space3270out(hSession,1); |
| 1022 | - *hSession->obptr++ = ORDER_GE; | 1022 | + *hSession->output.ptr++ = ORDER_GE; |
| 1023 | if (any) | 1023 | if (any) |
| 1024 | trace_ds(hSession,"'"); | 1024 | trace_ds(hSession,"'"); |
| 1025 | trace_ds(hSession," GraphicEscape"); | 1025 | trace_ds(hSession," GraphicEscape"); |
| 1026 | any = False; | 1026 | any = False; |
| 1027 | } | 1027 | } |
| 1028 | space3270out(hSession,1); | 1028 | space3270out(hSession,1); |
| 1029 | - *hSession->obptr++ = hSession->ea_buf[baddr].cc; | 1029 | + *hSession->output.ptr++ = hSession->ea_buf[baddr].cc; |
| 1030 | if (hSession->ea_buf[baddr].cc <= 0x3f || | 1030 | if (hSession->ea_buf[baddr].cc <= 0x3f || |
| 1031 | hSession->ea_buf[baddr].cc == 0xff) { | 1031 | hSession->ea_buf[baddr].cc == 0xff) { |
| 1032 | if (any) | 1032 | if (any) |
src/core/ft/ft_dft.c
| @@ -201,12 +201,12 @@ static void dft_open_request(H3270 *hSession, unsigned short len, unsigned char | @@ -201,12 +201,12 @@ static void dft_open_request(H3270 *hSession, unsigned short len, unsigned char | ||
| 201 | 201 | ||
| 202 | /* Acknowledge the Open. */ | 202 | /* Acknowledge the Open. */ |
| 203 | trace_ds(hSession,"> WriteStructuredField FileTransferData OpenAck\n"); | 203 | trace_ds(hSession,"> WriteStructuredField FileTransferData OpenAck\n"); |
| 204 | - hSession->obptr = hSession->obuf; | 204 | + hSession->output.ptr = hSession->output.buf; |
| 205 | space3270out(hSession,6); | 205 | space3270out(hSession,6); |
| 206 | - *hSession->obptr++ = AID_SF; | ||
| 207 | - SET16(hSession->obptr, 5); | ||
| 208 | - *hSession->obptr++ = SF_TRANSFER_DATA; | ||
| 209 | - SET16(hSession->obptr, 9); | 206 | + *hSession->output.ptr++ = AID_SF; |
| 207 | + SET16(hSession->output.ptr, 5); | ||
| 208 | + *hSession->output.ptr++ = SF_TRANSFER_DATA; | ||
| 209 | + SET16(hSession->output.ptr, 9); | ||
| 210 | net_output(hSession); | 210 | net_output(hSession); |
| 211 | } | 211 | } |
| 212 | 212 | ||
| @@ -338,14 +338,14 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) | @@ -338,14 +338,14 @@ static void dft_data_insert(H3270 *hSession, struct data_buffer *data_bufr) | ||
| 338 | 338 | ||
| 339 | /* Send an acknowledgement frame back. */ | 339 | /* Send an acknowledgement frame back. */ |
| 340 | trace_ds(hSession,"> WriteStructuredField FileTransferData DataAck(rec=%lu)\n", ft->recnum); | 340 | trace_ds(hSession,"> WriteStructuredField FileTransferData DataAck(rec=%lu)\n", ft->recnum); |
| 341 | - hSession->obptr = hSession->obuf; | 341 | + hSession->output.ptr = hSession->output.buf; |
| 342 | space3270out(hSession,12); | 342 | space3270out(hSession,12); |
| 343 | - *hSession->obptr++ = AID_SF; | ||
| 344 | - SET16(hSession->obptr, 11); | ||
| 345 | - *hSession->obptr++ = SF_TRANSFER_DATA; | ||
| 346 | - SET16(hSession->obptr, TR_NORMAL_REPLY); | ||
| 347 | - SET16(hSession->obptr, TR_RECNUM_HDR); | ||
| 348 | - SET32(hSession->obptr, ft->recnum); | 343 | + *hSession->output.ptr++ = AID_SF; |
| 344 | + SET16(hSession->output.ptr, 11); | ||
| 345 | + *hSession->output.ptr++ = SF_TRANSFER_DATA; | ||
| 346 | + SET16(hSession->output.ptr, TR_NORMAL_REPLY); | ||
| 347 | + SET16(hSession->output.ptr, TR_RECNUM_HDR); | ||
| 348 | + SET32(hSession->output.ptr, ft->recnum); | ||
| 349 | ft->recnum++; | 349 | ft->recnum++; |
| 350 | net_output(hSession); | 350 | net_output(hSession); |
| 351 | } | 351 | } |
| @@ -378,7 +378,7 @@ static void dft_get_request(H3270 *hSession) | @@ -378,7 +378,7 @@ static void dft_get_request(H3270 *hSession) | ||
| 378 | set_dft_buffersize(hSession); | 378 | set_dft_buffersize(hSession); |
| 379 | space3270out(hSession,hSession->dft_buffersize); | 379 | space3270out(hSession,hSession->dft_buffersize); |
| 380 | numbytes = hSession->dft_buffersize - 27; /* always read 5 bytes less than we're allowed */ | 380 | numbytes = hSession->dft_buffersize - 27; /* always read 5 bytes less than we're allowed */ |
| 381 | - bufptr = hSession->obuf + 17; | 381 | + bufptr = hSession->output.buf + 17; |
| 382 | 382 | ||
| 383 | while (!ft->dft_eof && numbytes) | 383 | while (!ft->dft_eof && numbytes) |
| 384 | { | 384 | { |
| @@ -456,22 +456,22 @@ static void dft_get_request(H3270 *hSession) | @@ -456,22 +456,22 @@ static void dft_get_request(H3270 *hSession) | ||
| 456 | } | 456 | } |
| 457 | 457 | ||
| 458 | /* Set up SF header for Data or EOF. */ | 458 | /* Set up SF header for Data or EOF. */ |
| 459 | - hSession->obptr = hSession->obuf; | ||
| 460 | - *hSession->obptr++ = AID_SF; | ||
| 461 | - hSession->obptr += 2; /* skip SF length for now */ | ||
| 462 | - *hSession->obptr++ = SF_TRANSFER_DATA; | 459 | + hSession->output.ptr = hSession->output.buf; |
| 460 | + *hSession->output.ptr++ = AID_SF; | ||
| 461 | + hSession->output.ptr += 2; /* skip SF length for now */ | ||
| 462 | + *hSession->output.ptr++ = SF_TRANSFER_DATA; | ||
| 463 | 463 | ||
| 464 | if (total_read) | 464 | if (total_read) |
| 465 | { | 465 | { |
| 466 | trace_ds(hSession,"> WriteStructuredField FileTransferData Data(rec=%lu) %d bytes\n",(unsigned long) ft->recnum, (int) total_read); | 466 | trace_ds(hSession,"> WriteStructuredField FileTransferData Data(rec=%lu) %d bytes\n",(unsigned long) ft->recnum, (int) total_read); |
| 467 | - SET16(hSession->obptr, TR_GET_REPLY); | ||
| 468 | - SET16(hSession->obptr, TR_RECNUM_HDR); | ||
| 469 | - SET32(hSession->obptr, ft->recnum); | 467 | + SET16(hSession->output.ptr, TR_GET_REPLY); |
| 468 | + SET16(hSession->output.ptr, TR_RECNUM_HDR); | ||
| 469 | + SET32(hSession->output.ptr, ft->recnum); | ||
| 470 | ft->recnum++; | 470 | ft->recnum++; |
| 471 | - SET16(hSession->obptr, TR_NOT_COMPRESSED); | ||
| 472 | - *hSession->obptr++ = TR_BEGIN_DATA; | ||
| 473 | - SET16(hSession->obptr, total_read + 5); | ||
| 474 | - hSession->obptr += total_read; | 471 | + SET16(hSession->output.ptr, TR_NOT_COMPRESSED); |
| 472 | + *hSession->output.ptr++ = TR_BEGIN_DATA; | ||
| 473 | + SET16(hSession->output.ptr, total_read + 5); | ||
| 474 | + hSession->output.ptr += total_read; | ||
| 475 | 475 | ||
| 476 | ft->ft_length += total_read; | 476 | ft->ft_length += total_read; |
| 477 | 477 | ||
| @@ -484,26 +484,26 @@ static void dft_get_request(H3270 *hSession) | @@ -484,26 +484,26 @@ static void dft_get_request(H3270 *hSession) | ||
| 484 | else | 484 | else |
| 485 | { | 485 | { |
| 486 | trace_ds(hSession,"> WriteStructuredField FileTransferData EOF\n"); | 486 | trace_ds(hSession,"> WriteStructuredField FileTransferData EOF\n"); |
| 487 | - *hSession->obptr++ = HIGH8(TR_GET_REQ); | ||
| 488 | - *hSession->obptr++ = TR_ERROR_REPLY; | ||
| 489 | - SET16(hSession->obptr, TR_ERROR_HDR); | ||
| 490 | - SET16(hSession->obptr, TR_ERR_EOF); | 487 | + *hSession->output.ptr++ = HIGH8(TR_GET_REQ); |
| 488 | + *hSession->output.ptr++ = TR_ERROR_REPLY; | ||
| 489 | + SET16(hSession->output.ptr, TR_ERROR_HDR); | ||
| 490 | + SET16(hSession->output.ptr, TR_ERR_EOF); | ||
| 491 | 491 | ||
| 492 | ft->dft_eof = 1; | 492 | ft->dft_eof = 1; |
| 493 | } | 493 | } |
| 494 | 494 | ||
| 495 | /* Set the SF length. */ | 495 | /* Set the SF length. */ |
| 496 | - bufptr = hSession->obuf + 1; | ||
| 497 | - SET16(bufptr, hSession->obptr - (hSession->obuf + 1)); | 496 | + bufptr = hSession->output.buf + 1; |
| 497 | + SET16(bufptr, hSession->output.ptr - (hSession->output.buf + 1)); | ||
| 498 | 498 | ||
| 499 | /* Save the data. */ | 499 | /* Save the data. */ |
| 500 | - ft->dft_savebuf_len = hSession->obptr - hSession->obuf; | 500 | + ft->dft_savebuf_len = hSession->output.ptr - hSession->output.buf; |
| 501 | if (ft->dft_savebuf_len > ft->dft_savebuf_max) | 501 | if (ft->dft_savebuf_len > ft->dft_savebuf_max) |
| 502 | { | 502 | { |
| 503 | ft->dft_savebuf_max = ft->dft_savebuf_len; | 503 | ft->dft_savebuf_max = ft->dft_savebuf_len; |
| 504 | Replace(ft->dft_savebuf, (unsigned char *)lib3270_malloc(ft->dft_savebuf_max)); | 504 | Replace(ft->dft_savebuf, (unsigned char *)lib3270_malloc(ft->dft_savebuf_max)); |
| 505 | } | 505 | } |
| 506 | - (void) memcpy(ft->dft_savebuf, hSession->obuf, ft->dft_savebuf_len); | 506 | + (void) memcpy(ft->dft_savebuf, hSession->output.buf, ft->dft_savebuf_len); |
| 507 | hSession->aid = AID_SF; | 507 | hSession->aid = AID_SF; |
| 508 | 508 | ||
| 509 | /* Write the data. */ | 509 | /* Write the data. */ |
| @@ -520,12 +520,12 @@ static void dft_close_request(H3270 *hSession) | @@ -520,12 +520,12 @@ static void dft_close_request(H3270 *hSession) | ||
| 520 | */ | 520 | */ |
| 521 | trace_ds(hSession," Close\n"); | 521 | trace_ds(hSession," Close\n"); |
| 522 | trace_ds(hSession,"> WriteStructuredField FileTransferData CloseAck\n"); | 522 | trace_ds(hSession,"> WriteStructuredField FileTransferData CloseAck\n"); |
| 523 | - hSession->obptr = hSession->obuf; | 523 | + hSession->output.ptr = hSession->output.buf; |
| 524 | space3270out(hSession,6); | 524 | space3270out(hSession,6); |
| 525 | - *hSession->obptr++ = AID_SF; | ||
| 526 | - SET16(hSession->obptr, 5); /* length */ | ||
| 527 | - *hSession->obptr++ = SF_TRANSFER_DATA; | ||
| 528 | - SET16(hSession->obptr, TR_CLOSE_REPLY); | 525 | + *hSession->output.ptr++ = AID_SF; |
| 526 | + SET16(hSession->output.ptr, 5); /* length */ | ||
| 527 | + *hSession->output.ptr++ = SF_TRANSFER_DATA; | ||
| 528 | + SET16(hSession->output.ptr, TR_CLOSE_REPLY); | ||
| 529 | net_output(hSession); | 529 | net_output(hSession); |
| 530 | } | 530 | } |
| 531 | 531 | ||
| @@ -543,15 +543,15 @@ static void dft_abort(H3270 *hSession, unsigned short code, const char *fmt, ... | @@ -543,15 +543,15 @@ static void dft_abort(H3270 *hSession, unsigned short code, const char *fmt, ... | ||
| 543 | 543 | ||
| 544 | trace_ds(hSession,"> WriteStructuredField FileTransferData Error\n"); | 544 | trace_ds(hSession,"> WriteStructuredField FileTransferData Error\n"); |
| 545 | 545 | ||
| 546 | - hSession->obptr = hSession->obuf; | 546 | + hSession->output.ptr = hSession->output.buf; |
| 547 | space3270out(hSession,10); | 547 | space3270out(hSession,10); |
| 548 | - *hSession->obptr++ = AID_SF; | ||
| 549 | - SET16(hSession->obptr, 9); /* length */ | ||
| 550 | - *hSession->obptr++ = SF_TRANSFER_DATA; | ||
| 551 | - *hSession->obptr++ = HIGH8(code); | ||
| 552 | - *hSession->obptr++ = TR_ERROR_REPLY; | ||
| 553 | - SET16(hSession->obptr, TR_ERROR_HDR); | ||
| 554 | - SET16(hSession->obptr, TR_ERR_CMDFAIL); | 548 | + *hSession->output.ptr++ = AID_SF; |
| 549 | + SET16(hSession->output.ptr, 9); /* length */ | ||
| 550 | + *hSession->output.ptr++ = SF_TRANSFER_DATA; | ||
| 551 | + *hSession->output.ptr++ = HIGH8(code); | ||
| 552 | + *hSession->output.ptr++ = TR_ERROR_REPLY; | ||
| 553 | + SET16(hSession->output.ptr, TR_ERROR_HDR); | ||
| 554 | + SET16(hSession->output.ptr, TR_ERR_CMDFAIL); | ||
| 555 | net_output(hSession); | 555 | net_output(hSession); |
| 556 | 556 | ||
| 557 | /* Update the pop-up and state. */ | 557 | /* Update the pop-up and state. */ |
| @@ -581,10 +581,10 @@ void dft_read_modified(H3270 *hSession) | @@ -581,10 +581,10 @@ void dft_read_modified(H3270 *hSession) | ||
| 581 | if(ft->dft_savebuf_len) | 581 | if(ft->dft_savebuf_len) |
| 582 | { | 582 | { |
| 583 | trace_ds(hSession,"> WriteStructuredField FileTransferData\n"); | 583 | trace_ds(hSession,"> WriteStructuredField FileTransferData\n"); |
| 584 | - hSession->obptr = hSession->obuf; | 584 | + hSession->output.ptr = hSession->output.buf; |
| 585 | space3270out(hSession,ft->dft_savebuf_len); | 585 | space3270out(hSession,ft->dft_savebuf_len); |
| 586 | - memcpy(hSession->obptr, ft->dft_savebuf, ft->dft_savebuf_len); | ||
| 587 | - hSession->obptr += ft->dft_savebuf_len; | 586 | + memcpy(hSession->output.ptr, ft->dft_savebuf, ft->dft_savebuf_len); |
| 587 | + hSession->output.ptr += ft->dft_savebuf_len; | ||
| 588 | net_output(hSession); | 588 | net_output(hSession); |
| 589 | } | 589 | } |
| 590 | } | 590 | } |
src/core/rpq.c
| @@ -146,14 +146,14 @@ void do_qr_rpqnames(H3270 *hSession) | @@ -146,14 +146,14 @@ void do_qr_rpqnames(H3270 *hSession) | ||
| 146 | */ | 146 | */ |
| 147 | space3270out(hSession,4+4+1+remaining); /* Maximum space for an RPQNAME item */ | 147 | space3270out(hSession,4+4+1+remaining); /* Maximum space for an RPQNAME item */ |
| 148 | 148 | ||
| 149 | - SET32(hSession->obptr, 0); /* Device number, 0 = All */ | ||
| 150 | - SET32(hSession->obptr, 0); /* Model number, 0 = All */ | 149 | + SET32(hSession->output.ptr, 0); /* Device number, 0 = All */ |
| 150 | + SET32(hSession->output.ptr, 0); /* Model number, 0 = All */ | ||
| 151 | 151 | ||
| 152 | - rpql = hSession->obptr++; /* Save address to place data length. */ | 152 | + rpql = hSession->output.ptr++; /* Save address to place data length. */ |
| 153 | 153 | ||
| 154 | /* Create fixed length portion - program id: x3270 */ | 154 | /* Create fixed length portion - program id: x3270 */ |
| 155 | for (j = 0; j < 5; j++) { | 155 | for (j = 0; j < 5; j++) { |
| 156 | - *hSession->obptr++ = hSession->charset.asc2ebc[(int)"x3270"[j]]; | 156 | + *hSession->output.ptr++ = hSession->charset.asc2ebc[(int)"x3270"[j]]; |
| 157 | remaining--; | 157 | remaining--; |
| 158 | } | 158 | } |
| 159 | 159 | ||
| @@ -168,9 +168,9 @@ void do_qr_rpqnames(H3270 *hSession) | @@ -168,9 +168,9 @@ void do_qr_rpqnames(H3270 *hSession) | ||
| 168 | 168 | ||
| 169 | term_id = rpq_keywords[j].id; | 169 | term_id = rpq_keywords[j].id; |
| 170 | 170 | ||
| 171 | - p_term = hSession->obptr; /* save starting address (to insert length later) */ | ||
| 172 | - hSession->obptr++; /* skip length of term, fill in later */ | ||
| 173 | - *hSession->obptr++ = term_id; /* identify this term */ | 171 | + p_term = hSession->output.ptr; /* save starting address (to insert length later) */ |
| 172 | + hSession->output.ptr++; /* skip length of term, fill in later */ | ||
| 173 | + *hSession->output.ptr++ = term_id; /* identify this term */ | ||
| 174 | 174 | ||
| 175 | /* | 175 | /* |
| 176 | * Adjust remaining space by the term prefix size so each case | 176 | * Adjust remaining space by the term prefix size so each case |
| @@ -183,18 +183,18 @@ void do_qr_rpqnames(H3270 *hSession) | @@ -183,18 +183,18 @@ void do_qr_rpqnames(H3270 *hSession) | ||
| 183 | switch (term_id) /* build the term based on id */ | 183 | switch (term_id) /* build the term based on id */ |
| 184 | { | 184 | { |
| 185 | case RPQ_USER: /* User text from env. vars */ | 185 | case RPQ_USER: /* User text from env. vars */ |
| 186 | - hSession->obptr += get_rpq_user(hSession,hSession->obptr, remaining); | 186 | + hSession->output.ptr += get_rpq_user(hSession,hSession->output.ptr, remaining); |
| 187 | break; | 187 | break; |
| 188 | 188 | ||
| 189 | case RPQ_TIMEZONE: /* UTC time offset */ | 189 | case RPQ_TIMEZONE: /* UTC time offset */ |
| 190 | omit_due_space_limit = (remaining < 2); | 190 | omit_due_space_limit = (remaining < 2); |
| 191 | if (!omit_due_space_limit) | 191 | if (!omit_due_space_limit) |
| 192 | - SET16(hSession->obptr, get_rpq_timezone(hSession)); | 192 | + SET16(hSession->output.ptr, get_rpq_timezone(hSession)); |
| 193 | break; | 193 | break; |
| 194 | 194 | ||
| 195 | case RPQ_ADDRESS: /* Workstation address */ | 195 | case RPQ_ADDRESS: /* Workstation address */ |
| 196 | #if !defined(_WIN32) /*[*/ | 196 | #if !defined(_WIN32) /*[*/ |
| 197 | - hSession->obptr += get_rpq_address(hSession, hSession->obptr, remaining); | 197 | + hSession->output.ptr += get_rpq_address(hSession, hSession->output.ptr, remaining); |
| 198 | #endif /*]*/ | 198 | #endif /*]*/ |
| 199 | break; | 199 | break; |
| 200 | 200 | ||
| @@ -205,7 +205,7 @@ void do_qr_rpqnames(H3270 *hSession) | @@ -205,7 +205,7 @@ void do_qr_rpqnames(H3270 *hSession) | ||
| 205 | { | 205 | { |
| 206 | for (i = 0; i < x; i++) | 206 | for (i = 0; i < x; i++) |
| 207 | { | 207 | { |
| 208 | - *hSession->obptr++ = hSession->charset.asc2ebc[(int)(*(build_rpq_version+i) & 0xff)]; | 208 | + *hSession->output.ptr++ = hSession->charset.asc2ebc[(int)(*(build_rpq_version+i) & 0xff)]; |
| 209 | } | 209 | } |
| 210 | } | 210 | } |
| 211 | break; | 211 | break; |
| @@ -217,7 +217,7 @@ void do_qr_rpqnames(H3270 *hSession) | @@ -217,7 +217,7 @@ void do_qr_rpqnames(H3270 *hSession) | ||
| 217 | { | 217 | { |
| 218 | for (i=0; i < x; i+=2) | 218 | for (i=0; i < x; i+=2) |
| 219 | { | 219 | { |
| 220 | - *hSession->obptr++ = ((*(build_rpq_timestamp+i) - '0') << 4) | 220 | + *hSession->output.ptr++ = ((*(build_rpq_timestamp+i) - '0') << 4) |
| 221 | + (*(build_rpq_timestamp+i+1) - '0'); | 221 | + (*(build_rpq_timestamp+i+1) - '0'); |
| 222 | } | 222 | } |
| 223 | } | 223 | } |
| @@ -239,14 +239,14 @@ void do_qr_rpqnames(H3270 *hSession) | @@ -239,14 +239,14 @@ void do_qr_rpqnames(H3270 *hSession) | ||
| 239 | * adjust space remaining. | 239 | * adjust space remaining. |
| 240 | * obptr now points at "next available byte". | 240 | * obptr now points at "next available byte". |
| 241 | */ | 241 | */ |
| 242 | - x = hSession->obptr-p_term; | 242 | + x = hSession->output.ptr-p_term; |
| 243 | if (x > TERM_PREFIX_SIZE) { | 243 | if (x > TERM_PREFIX_SIZE) { |
| 244 | *p_term = x; | 244 | *p_term = x; |
| 245 | remaining -= x; /* This includes length and id fields, | 245 | remaining -= x; /* This includes length and id fields, |
| 246 | correction below */ | 246 | correction below */ |
| 247 | } else { | 247 | } else { |
| 248 | /* We didn't add an item after all, reset pointer. */ | 248 | /* We didn't add an item after all, reset pointer. */ |
| 249 | - hSession->obptr = p_term; | 249 | + hSession->output.ptr = p_term; |
| 250 | } | 250 | } |
| 251 | /* | 251 | /* |
| 252 | * When we calculated the length of the term, a few lines | 252 | * When we calculated the length of the term, a few lines |
| @@ -268,7 +268,7 @@ void do_qr_rpqnames(H3270 *hSession) | @@ -268,7 +268,7 @@ void do_qr_rpqnames(H3270 *hSession) | ||
| 268 | } | 268 | } |
| 269 | 269 | ||
| 270 | /* Fill in overall length of RPQNAME info */ | 270 | /* Fill in overall length of RPQNAME info */ |
| 271 | - *rpql = (hSession->obptr - rpql); | 271 | + *rpql = (hSession->output.ptr - rpql); |
| 272 | 272 | ||
| 273 | rpq_dump_warnings(hSession); | 273 | rpq_dump_warnings(hSession); |
| 274 | } | 274 | } |
src/core/session.c
| @@ -140,7 +140,7 @@ void lib3270_session_free(H3270 *h) | @@ -140,7 +140,7 @@ void lib3270_session_free(H3270 *h) | ||
| 140 | release_pointer(h->text); | 140 | release_pointer(h->text); |
| 141 | release_pointer(h->zero_buf); | 141 | release_pointer(h->zero_buf); |
| 142 | 142 | ||
| 143 | - release_pointer(h->obuf_base); | 143 | + release_pointer(h->output.base); |
| 144 | 144 | ||
| 145 | release_pointer(h->sbbuf); | 145 | release_pointer(h->sbbuf); |
| 146 | release_pointer(h->tabs); | 146 | release_pointer(h->tabs); |
src/core/sf.c
| @@ -93,12 +93,19 @@ static void query_reply_start(H3270 *hSession); | @@ -93,12 +93,19 @@ static void query_reply_start(H3270 *hSession); | ||
| 93 | static void do_query_reply(H3270 *hSession, unsigned char code); | 93 | static void do_query_reply(H3270 *hSession, unsigned char code); |
| 94 | static void query_reply_end(H3270 *hSession); | 94 | static void query_reply_end(H3270 *hSession); |
| 95 | 95 | ||
| 96 | -typedef Boolean qr_multi_fn_t(H3270 *hSession, unsigned *subindex, Boolean *more); | ||
| 97 | - | ||
| 98 | -static qr_single_fn_t do_qr_summary, do_qr_usable_area, do_qr_alpha_part, | ||
| 99 | - do_qr_charsets, do_qr_color, do_qr_highlighting, do_qr_reply_modes, | ||
| 100 | - do_qr_imp_part, do_qr_null; | 96 | +//static void qr_single_fn_t(H3270 *hSession); |
| 97 | + | ||
| 98 | +static void do_qr_summary(H3270 *hSession); | ||
| 99 | +static void do_qr_usable_area(H3270 *hSession); | ||
| 100 | +static void do_qr_alpha_part(H3270 *hSession); | ||
| 101 | +static void do_qr_charsets(H3270 *hSession); | ||
| 102 | +static void do_qr_color(H3270 *hSession); | ||
| 103 | +static void do_qr_highlighting(H3270 *hSession); | ||
| 104 | +static void do_qr_reply_modes(H3270 *hSession); | ||
| 105 | +static void do_qr_imp_part(H3270 *hSession); | ||
| 106 | +static void do_qr_null(H3270 *hSession); | ||
| 101 | 107 | ||
| 108 | +typedef Boolean qr_multi_fn_t(H3270 *hSession, unsigned *subindex, Boolean *more); | ||
| 102 | 109 | ||
| 103 | #if defined(X3270_DBCS) /*[*/ | 110 | #if defined(X3270_DBCS) /*[*/ |
| 104 | static qr_single_fn_t do_qr_dbcs_asia; | 111 | static qr_single_fn_t do_qr_dbcs_asia; |
| @@ -692,9 +699,9 @@ static enum pds sf_outbound_ds(H3270 *hSession, unsigned char buf[], int buflen) | @@ -692,9 +699,9 @@ static enum pds sf_outbound_ds(H3270 *hSession, unsigned char buf[], int buflen) | ||
| 692 | 699 | ||
| 693 | static void query_reply_start(H3270 *hSession) | 700 | static void query_reply_start(H3270 *hSession) |
| 694 | { | 701 | { |
| 695 | - hSession->obptr = hSession->obuf; | 702 | + hSession->output.ptr = hSession->output.buf; |
| 696 | space3270out(hSession,1); | 703 | space3270out(hSession,1); |
| 697 | - *hSession->obptr++ = AID_SF; | 704 | + *hSession->output.ptr++ = AID_SF; |
| 698 | qr_in_progress = True; | 705 | qr_in_progress = True; |
| 699 | } | 706 | } |
| 700 | 707 | ||
| @@ -721,13 +728,13 @@ static void do_query_reply(H3270 *hSession, unsigned char code) | @@ -721,13 +728,13 @@ static void do_query_reply(H3270 *hSession, unsigned char code) | ||
| 721 | 728 | ||
| 722 | do | 729 | do |
| 723 | { | 730 | { |
| 724 | - int obptr0 = hSession->obptr - hSession->obuf; | 731 | + int obptr0 = hSession->output.ptr - hSession->output.buf; |
| 725 | Boolean full = True; | 732 | Boolean full = True; |
| 726 | 733 | ||
| 727 | space3270out(hSession,4); | 734 | space3270out(hSession,4); |
| 728 | - hSession->obptr += 2; /* skip length for now */ | ||
| 729 | - *hSession->obptr++ = SFID_QREPLY; | ||
| 730 | - *hSession->obptr++ = code; | 735 | + hSession->output.ptr += 2; /* skip length for now */ |
| 736 | + *hSession->output.ptr++ = SFID_QREPLY; | ||
| 737 | + *hSession->output.ptr++ = code; | ||
| 731 | 738 | ||
| 732 | more = False; | 739 | more = False; |
| 733 | if (replies[i].single_fn) | 740 | if (replies[i].single_fn) |
| @@ -741,12 +748,12 @@ static void do_query_reply(H3270 *hSession, unsigned char code) | @@ -741,12 +748,12 @@ static void do_query_reply(H3270 *hSession, unsigned char code) | ||
| 741 | unsigned char *obptr_len; | 748 | unsigned char *obptr_len; |
| 742 | 749 | ||
| 743 | /* Fill in the length. */ | 750 | /* Fill in the length. */ |
| 744 | - obptr_len = hSession->obuf + obptr0; | ||
| 745 | - len = (hSession->obptr - hSession->obuf) - obptr0; | 751 | + obptr_len = hSession->output.buf + obptr0; |
| 752 | + len = (hSession->output.ptr - hSession->output.buf) - obptr0; | ||
| 746 | SET16(obptr_len, len); | 753 | SET16(obptr_len, len); |
| 747 | } else { | 754 | } else { |
| 748 | /* Back over the header. */ | 755 | /* Back over the header. */ |
| 749 | - hSession->obptr -= 4; | 756 | + hSession->output.ptr -= 4; |
| 750 | } | 757 | } |
| 751 | } while (more); | 758 | } while (more); |
| 752 | } | 759 | } |
| @@ -771,7 +778,7 @@ static void do_qr_summary(H3270 *hSession) | @@ -771,7 +778,7 @@ static void do_qr_summary(H3270 *hSession) | ||
| 771 | #endif /*]*/ | 778 | #endif /*]*/ |
| 772 | trace_ds(hSession,"%s%s", comma, see_qcode(replies[i].code)); | 779 | trace_ds(hSession,"%s%s", comma, see_qcode(replies[i].code)); |
| 773 | comma = ","; | 780 | comma = ","; |
| 774 | - *hSession->obptr++ = replies[i].code; | 781 | + *hSession->output.ptr++ = replies[i].code; |
| 775 | #if defined(X3270_DBCS) /*[*/ | 782 | #if defined(X3270_DBCS) /*[*/ |
| 776 | } | 783 | } |
| 777 | #endif /*]*/ | 784 | #endif /*]*/ |
| @@ -785,11 +792,11 @@ static void do_qr_usable_area(H3270 *hSession) | @@ -785,11 +792,11 @@ static void do_qr_usable_area(H3270 *hSession) | ||
| 785 | 792 | ||
| 786 | trace_ds(hSession,"> QueryReply(UsableArea)\n"); | 793 | trace_ds(hSession,"> QueryReply(UsableArea)\n"); |
| 787 | space3270out(hSession,19); | 794 | space3270out(hSession,19); |
| 788 | - *hSession->obptr++ = 0x01; /* 12/14-bit addressing */ | ||
| 789 | - *hSession->obptr++ = 0x00; /* no special character features */ | ||
| 790 | - SET16(hSession->obptr, hSession->max.cols); /* usable width */ | ||
| 791 | - SET16(hSession->obptr, hSession->max.rows); /* usable height */ | ||
| 792 | - *hSession->obptr++ = 0x01; /* units (mm) */ | 795 | + *hSession->output.ptr++ = 0x01; /* 12/14-bit addressing */ |
| 796 | + *hSession->output.ptr++ = 0x00; /* no special character features */ | ||
| 797 | + SET16(hSession->output.ptr, hSession->max.cols); /* usable width */ | ||
| 798 | + SET16(hSession->output.ptr, hSession->max.rows); /* usable height */ | ||
| 799 | + *hSession->output.ptr++ = 0x01; /* units (mm) */ | ||
| 793 | num = display_widthMM(); | 800 | num = display_widthMM(); |
| 794 | denom = display_width(); | 801 | denom = display_width(); |
| 795 | while (!(num %2) && !(denom % 2)) | 802 | while (!(num %2) && !(denom % 2)) |
| @@ -797,8 +804,8 @@ static void do_qr_usable_area(H3270 *hSession) | @@ -797,8 +804,8 @@ static void do_qr_usable_area(H3270 *hSession) | ||
| 797 | num /= 2; | 804 | num /= 2; |
| 798 | denom /= 2; | 805 | denom /= 2; |
| 799 | } | 806 | } |
| 800 | - SET16(hSession->obptr, (int)num); /* Xr numerator */ | ||
| 801 | - SET16(hSession->obptr, (int)denom); /* Xr denominator */ | 807 | + SET16(hSession->output.ptr, (int)num); /* Xr numerator */ |
| 808 | + SET16(hSession->output.ptr, (int)denom); /* Xr denominator */ | ||
| 802 | num = display_heightMM(); | 809 | num = display_heightMM(); |
| 803 | denom = display_height(); | 810 | denom = display_height(); |
| 804 | while (!(num %2) && !(denom % 2)) | 811 | while (!(num %2) && !(denom % 2)) |
| @@ -806,11 +813,11 @@ static void do_qr_usable_area(H3270 *hSession) | @@ -806,11 +813,11 @@ static void do_qr_usable_area(H3270 *hSession) | ||
| 806 | num /= 2; | 813 | num /= 2; |
| 807 | denom /= 2; | 814 | denom /= 2; |
| 808 | } | 815 | } |
| 809 | - SET16(hSession->obptr, (int)num); /* Yr numerator */ | ||
| 810 | - SET16(hSession->obptr, (int)denom); /* Yr denominator */ | ||
| 811 | - *hSession->obptr++ = *char_width; /* AW */ | ||
| 812 | - *hSession->obptr++ = *char_height; /* AH */ | ||
| 813 | - SET16(hSession->obptr, hSession->max.cols * hSession->max.cols); /* buffer, questionable */ | 816 | + SET16(hSession->output.ptr, (int)num); /* Yr numerator */ |
| 817 | + SET16(hSession->output.ptr, (int)denom); /* Yr denominator */ | ||
| 818 | + *hSession->output.ptr++ = *char_width; /* AW */ | ||
| 819 | + *hSession->output.ptr++ = *char_height; /* AH */ | ||
| 820 | + SET16(hSession->output.ptr, hSession->max.cols * hSession->max.cols); /* buffer, questionable */ | ||
| 814 | } | 821 | } |
| 815 | 822 | ||
| 816 | static void do_qr_color(H3270 *hSession) | 823 | static void do_qr_color(H3270 *hSession) |
| @@ -823,17 +830,17 @@ static void do_qr_color(H3270 *hSession) | @@ -823,17 +830,17 @@ static void do_qr_color(H3270 *hSession) | ||
| 823 | color_max = (hSession->colors == 8) ? 8: 16; /* report on 8 or 16 colors */ | 830 | color_max = (hSession->colors == 8) ? 8: 16; /* report on 8 or 16 colors */ |
| 824 | 831 | ||
| 825 | space3270out(hSession,4 + 2*15); | 832 | space3270out(hSession,4 + 2*15); |
| 826 | - *hSession->obptr++ = 0x00; /* no options */ | ||
| 827 | - *hSession->obptr++ = color_max; /* report on 8 or 16 colors */ | ||
| 828 | - *hSession->obptr++ = 0x00; /* default color: */ | ||
| 829 | - *hSession->obptr++ = 0xf0 + COLOR_GREEN; /* green */ | 833 | + *hSession->output.ptr++ = 0x00; /* no options */ |
| 834 | + *hSession->output.ptr++ = color_max; /* report on 8 or 16 colors */ | ||
| 835 | + *hSession->output.ptr++ = 0x00; /* default color: */ | ||
| 836 | + *hSession->output.ptr++ = 0xf0 + COLOR_GREEN; /* green */ | ||
| 830 | for (i = 0xf1; i < 0xf1 + color_max - 1; i++) | 837 | for (i = 0xf1; i < 0xf1 + color_max - 1; i++) |
| 831 | { | 838 | { |
| 832 | - *hSession->obptr++ = i; | 839 | + *hSession->output.ptr++ = i; |
| 833 | if (hSession->m3279) | 840 | if (hSession->m3279) |
| 834 | - *hSession->obptr++ = i; | 841 | + *hSession->output.ptr++ = i; |
| 835 | else | 842 | else |
| 836 | - *hSession->obptr++ = 0x00; | 843 | + *hSession->output.ptr++ = 0x00; |
| 837 | } | 844 | } |
| 838 | 845 | ||
| 839 | /* | 846 | /* |
| @@ -841,10 +848,10 @@ static void do_qr_color(H3270 *hSession) | @@ -841,10 +848,10 @@ static void do_qr_color(H3270 *hSession) | ||
| 841 | // Add background color. | 848 | // Add background color. |
| 842 | if (hSession->m3279) { | 849 | if (hSession->m3279) { |
| 843 | space3270out(4); | 850 | space3270out(4); |
| 844 | - *hSession->obptr++ = 4; // length | ||
| 845 | - *hSession->obptr++ = 0x02; // background color | ||
| 846 | - *hSession->obptr++ = 0x00; // attribute | ||
| 847 | - *hSession->obptr++ = 0xf0; // default color | 851 | + *hSession->output.ptr++ = 4; // length |
| 852 | + *hSession->output.ptr++ = 0x02; // background color | ||
| 853 | + *hSession->output.ptr++ = 0x00; // attribute | ||
| 854 | + *hSession->output.ptr++ = 0xf0; // default color | ||
| 848 | } | 855 | } |
| 849 | #endif | 856 | #endif |
| 850 | */ | 857 | */ |
| @@ -854,26 +861,26 @@ static void do_qr_highlighting(H3270 *hSession) | @@ -854,26 +861,26 @@ static void do_qr_highlighting(H3270 *hSession) | ||
| 854 | { | 861 | { |
| 855 | trace_ds(hSession,"> QueryReply(Highlighting)\n"); | 862 | trace_ds(hSession,"> QueryReply(Highlighting)\n"); |
| 856 | space3270out(hSession,11); | 863 | space3270out(hSession,11); |
| 857 | - *hSession->obptr++ = 5; /* report on 5 pairs */ | ||
| 858 | - *hSession->obptr++ = XAH_DEFAULT; /* default: */ | ||
| 859 | - *hSession->obptr++ = XAH_NORMAL; /* normal */ | ||
| 860 | - *hSession->obptr++ = XAH_BLINK; /* blink: */ | ||
| 861 | - *hSession->obptr++ = XAH_BLINK; /* blink */ | ||
| 862 | - *hSession->obptr++ = XAH_REVERSE; /* reverse: */ | ||
| 863 | - *hSession->obptr++ = XAH_REVERSE; /* reverse */ | ||
| 864 | - *hSession->obptr++ = XAH_UNDERSCORE; /* underscore: */ | ||
| 865 | - *hSession->obptr++ = XAH_UNDERSCORE; /* underscore */ | ||
| 866 | - *hSession->obptr++ = XAH_INTENSIFY; /* intensify: */ | ||
| 867 | - *hSession->obptr++ = XAH_INTENSIFY; /* intensify */ | 864 | + *hSession->output.ptr++ = 5; /* report on 5 pairs */ |
| 865 | + *hSession->output.ptr++ = XAH_DEFAULT; /* default: */ | ||
| 866 | + *hSession->output.ptr++ = XAH_NORMAL; /* normal */ | ||
| 867 | + *hSession->output.ptr++ = XAH_BLINK; /* blink: */ | ||
| 868 | + *hSession->output.ptr++ = XAH_BLINK; /* blink */ | ||
| 869 | + *hSession->output.ptr++ = XAH_REVERSE; /* reverse: */ | ||
| 870 | + *hSession->output.ptr++ = XAH_REVERSE; /* reverse */ | ||
| 871 | + *hSession->output.ptr++ = XAH_UNDERSCORE; /* underscore: */ | ||
| 872 | + *hSession->output.ptr++ = XAH_UNDERSCORE; /* underscore */ | ||
| 873 | + *hSession->output.ptr++ = XAH_INTENSIFY; /* intensify: */ | ||
| 874 | + *hSession->output.ptr++ = XAH_INTENSIFY; /* intensify */ | ||
| 868 | } | 875 | } |
| 869 | 876 | ||
| 870 | static void do_qr_reply_modes(H3270 *hSession) | 877 | static void do_qr_reply_modes(H3270 *hSession) |
| 871 | { | 878 | { |
| 872 | trace_ds(hSession,"> QueryReply(ReplyModes)\n"); | 879 | trace_ds(hSession,"> QueryReply(ReplyModes)\n"); |
| 873 | space3270out(hSession,3); | 880 | space3270out(hSession,3); |
| 874 | - *hSession->obptr++ = SF_SRM_FIELD; | ||
| 875 | - *hSession->obptr++ = SF_SRM_XFIELD; | ||
| 876 | - *hSession->obptr++ = SF_SRM_CHAR; | 881 | + *hSession->output.ptr++ = SF_SRM_FIELD; |
| 882 | + *hSession->output.ptr++ = SF_SRM_XFIELD; | ||
| 883 | + *hSession->output.ptr++ = SF_SRM_CHAR; | ||
| 877 | } | 884 | } |
| 878 | 885 | ||
| 879 | #if defined(X3270_DBCS) /*[*/ | 886 | #if defined(X3270_DBCS) /*[*/ |
| @@ -882,13 +889,13 @@ static void do_qr_dbcs_asia(H3270 *hSession) | @@ -882,13 +889,13 @@ static void do_qr_dbcs_asia(H3270 *hSession) | ||
| 882 | /* XXX: Should we support this, even when not in DBCS mode? */ | 889 | /* XXX: Should we support this, even when not in DBCS mode? */ |
| 883 | trace_ds(hSession,"> QueryReply(DbcsAsia)\n"); | 890 | trace_ds(hSession,"> QueryReply(DbcsAsia)\n"); |
| 884 | space3270out(hSession,7); | 891 | space3270out(hSession,7); |
| 885 | - *hSession->obptr++ = 0x00; /* flags (none) */ | ||
| 886 | - *hSession->obptr++ = 0x03; /* field length 3 */ | ||
| 887 | - *hSession->obptr++ = 0x01; /* SI/SO supported */ | ||
| 888 | - *hSession->obptr++ = 0x80; /* character set ID 0x80 */ | ||
| 889 | - *hSession->obptr++ = 0x03; /* field length 3 */ | ||
| 890 | - *hSession->obptr++ = 0x02; /* input control */ | ||
| 891 | - *hSession->obptr++ = 0x01; /* creation supported */ | 892 | + *hSession->output.ptr++ = 0x00; /* flags (none) */ |
| 893 | + *hSession->output.ptr++ = 0x03; /* field length 3 */ | ||
| 894 | + *hSession->output.ptr++ = 0x01; /* SI/SO supported */ | ||
| 895 | + *hSession->output.ptr++ = 0x80; /* character set ID 0x80 */ | ||
| 896 | + *hSession->output.ptr++ = 0x03; /* field length 3 */ | ||
| 897 | + *hSession->output.ptr++ = 0x02; /* input control */ | ||
| 898 | + *hSession->output.ptr++ = 0x01; /* creation supported */ | ||
| 892 | } | 899 | } |
| 893 | #endif /*]*/ | 900 | #endif /*]*/ |
| 894 | 901 | ||
| @@ -896,9 +903,9 @@ static void do_qr_alpha_part(H3270 *hSession) | @@ -896,9 +903,9 @@ static void do_qr_alpha_part(H3270 *hSession) | ||
| 896 | { | 903 | { |
| 897 | trace_ds(hSession,"> QueryReply(AlphanumericPartitions)\n"); | 904 | trace_ds(hSession,"> QueryReply(AlphanumericPartitions)\n"); |
| 898 | space3270out(hSession,4); | 905 | space3270out(hSession,4); |
| 899 | - *hSession->obptr++ = 0; /* 1 partition */ | ||
| 900 | - SET16(hSession->obptr, hSession->max.cols * hSession->max.rows); /* buffer space */ | ||
| 901 | - *hSession->obptr++ = 0; /* no special features */ | 906 | + *hSession->output.ptr++ = 0; /* 1 partition */ |
| 907 | + SET16(hSession->output.ptr, hSession->max.cols * hSession->max.rows); /* buffer space */ | ||
| 908 | + *hSession->output.ptr++ = 0; /* no special features */ | ||
| 902 | } | 909 | } |
| 903 | 910 | ||
| 904 | static void do_qr_charsets(H3270 *hSession) | 911 | static void do_qr_charsets(H3270 *hSession) |
| @@ -907,79 +914,79 @@ static void do_qr_charsets(H3270 *hSession) | @@ -907,79 +914,79 @@ static void do_qr_charsets(H3270 *hSession) | ||
| 907 | space3270out(hSession,64); | 914 | space3270out(hSession,64); |
| 908 | #if defined(X3270_DBCS) /*[*/ | 915 | #if defined(X3270_DBCS) /*[*/ |
| 909 | if (dbcs) | 916 | if (dbcs) |
| 910 | - *hSession->obptr++ = 0x8e; /* flags: GE, CGCSGID, DBCS */ | 917 | + *hSession->output.ptr++ = 0x8e; /* flags: GE, CGCSGID, DBCS */ |
| 911 | else | 918 | else |
| 912 | #endif /*]*/ | 919 | #endif /*]*/ |
| 913 | - *hSession->obptr++ = 0x82; /* flags: GE, CGCSGID present */ | ||
| 914 | - | ||
| 915 | - *hSession->obptr++ = 0x00; /* more flags */ | ||
| 916 | - *hSession->obptr++ = *char_width; /* SDW */ | ||
| 917 | - *hSession->obptr++ = *char_height; /* SDW */ | ||
| 918 | - *hSession->obptr++ = 0x00; /* no load PS */ | ||
| 919 | - *hSession->obptr++ = 0x00; | ||
| 920 | - *hSession->obptr++ = 0x00; | ||
| 921 | - *hSession->obptr++ = 0x00; | 920 | + *hSession->output.ptr++ = 0x82; /* flags: GE, CGCSGID present */ |
| 921 | + | ||
| 922 | + *hSession->output.ptr++ = 0x00; /* more flags */ | ||
| 923 | + *hSession->output.ptr++ = *char_width; /* SDW */ | ||
| 924 | + *hSession->output.ptr++ = *char_height; /* SDW */ | ||
| 925 | + *hSession->output.ptr++ = 0x00; /* no load PS */ | ||
| 926 | + *hSession->output.ptr++ = 0x00; | ||
| 927 | + *hSession->output.ptr++ = 0x00; | ||
| 928 | + *hSession->output.ptr++ = 0x00; | ||
| 922 | #if defined(X3270_DBCS) /*[*/ | 929 | #if defined(X3270_DBCS) /*[*/ |
| 923 | if (dbcs) | 930 | if (dbcs) |
| 924 | - *hSession->obptr++ = 0x0b; /* DL (11 bytes) */ | 931 | + *hSession->output.ptr++ = 0x0b; /* DL (11 bytes) */ |
| 925 | else | 932 | else |
| 926 | #endif /*]*/ | 933 | #endif /*]*/ |
| 927 | - *hSession->obptr++ = 0x07; /* DL (7 bytes) */ | 934 | + *hSession->output.ptr++ = 0x07; /* DL (7 bytes) */ |
| 928 | 935 | ||
| 929 | - *hSession->obptr++ = 0x00; /* SET 0: */ | 936 | + *hSession->output.ptr++ = 0x00; /* SET 0: */ |
| 930 | #if defined(X3270_DBCS) /*[*/ | 937 | #if defined(X3270_DBCS) /*[*/ |
| 931 | if (dbcs) | 938 | if (dbcs) |
| 932 | - *hSession->obptr++ = 0x00; /* FLAGS: non-load, single- | 939 | + *hSession->output.ptr++ = 0x00; /* FLAGS: non-load, single- |
| 933 | plane, single-bute */ | 940 | plane, single-bute */ |
| 934 | else | 941 | else |
| 935 | #endif /*]*/ | 942 | #endif /*]*/ |
| 936 | - *hSession->obptr++ = 0x10; /* FLAGS: non-loadable, | 943 | + *hSession->output.ptr++ = 0x10; /* FLAGS: non-loadable, |
| 937 | single-plane, single-byte, | 944 | single-plane, single-byte, |
| 938 | no compare */ | 945 | no compare */ |
| 939 | - *hSession->obptr++ = 0x00; /* LCID 0 */ | 946 | + *hSession->output.ptr++ = 0x00; /* LCID 0 */ |
| 940 | #if defined(X3270_DBCS) /*[*/ | 947 | #if defined(X3270_DBCS) /*[*/ |
| 941 | if (dbcs) { | 948 | if (dbcs) { |
| 942 | - *hSession->obptr++ = 0x00; /* SW 0 */ | ||
| 943 | - *hSession->obptr++ = 0x00; /* SH 0 */ | ||
| 944 | - *hSession->obptr++ = 0x00; /* SUBSN */ | ||
| 945 | - *hSession->obptr++ = 0x00; /* SUBSN */ | 949 | + *hSession->output.ptr++ = 0x00; /* SW 0 */ |
| 950 | + *hSession->output.ptr++ = 0x00; /* SH 0 */ | ||
| 951 | + *hSession->output.ptr++ = 0x00; /* SUBSN */ | ||
| 952 | + *hSession->output.ptr++ = 0x00; /* SUBSN */ | ||
| 946 | } | 953 | } |
| 947 | #endif /*]*/ | 954 | #endif /*]*/ |
| 948 | - SET32(hSession->obptr, hSession->charset.cgcsgid); /* CGCSGID */ | 955 | + SET32(hSession->output.ptr, hSession->charset.cgcsgid); /* CGCSGID */ |
| 949 | if (!*standard_font) | 956 | if (!*standard_font) |
| 950 | { | 957 | { |
| 951 | /* special 3270 font, includes APL */ | 958 | /* special 3270 font, includes APL */ |
| 952 | - *hSession->obptr++ = 0x01;/* SET 1: */ | 959 | + *hSession->output.ptr++ = 0x01;/* SET 1: */ |
| 953 | if (hSession->apl_mode) | 960 | if (hSession->apl_mode) |
| 954 | - *hSession->obptr++ = 0x00;/* FLAGS: non-loadable, single-plane, single-byte, no compare */ | 961 | + *hSession->output.ptr++ = 0x00;/* FLAGS: non-loadable, single-plane, single-byte, no compare */ |
| 955 | else | 962 | else |
| 956 | - *hSession->obptr++ = 0x10;/* FLAGS: non-loadable, single-plane, single-byte, no compare */ | ||
| 957 | - *hSession->obptr++ = 0xf1;/* LCID */ | 963 | + *hSession->output.ptr++ = 0x10;/* FLAGS: non-loadable, single-plane, single-byte, no compare */ |
| 964 | + *hSession->output.ptr++ = 0xf1;/* LCID */ | ||
| 958 | #if defined(X3270_DBCS) /*[*/ | 965 | #if defined(X3270_DBCS) /*[*/ |
| 959 | if (dbcs) | 966 | if (dbcs) |
| 960 | { | 967 | { |
| 961 | - *hSession->obptr++ = 0x00;/* SW 0 */ | ||
| 962 | - *hSession->obptr++ = 0x00;/* SH 0 */ | ||
| 963 | - *hSession->obptr++ = 0x00;/* SUBSN */ | ||
| 964 | - *hSession->obptr++ = 0x00;/* SUBSN */ | 968 | + *hSession->output.ptr++ = 0x00;/* SW 0 */ |
| 969 | + *hSession->output.ptr++ = 0x00;/* SH 0 */ | ||
| 970 | + *hSession->output.ptr++ = 0x00;/* SUBSN */ | ||
| 971 | + *hSession->output.ptr++ = 0x00;/* SUBSN */ | ||
| 965 | } | 972 | } |
| 966 | #endif /*]*/ | 973 | #endif /*]*/ |
| 967 | - *hSession->obptr++ = 0x03;/* CGCSGID: 3179-style APL2 */ | ||
| 968 | - *hSession->obptr++ = 0xc3; | ||
| 969 | - *hSession->obptr++ = 0x01; | ||
| 970 | - *hSession->obptr++ = 0x36; | 974 | + *hSession->output.ptr++ = 0x03;/* CGCSGID: 3179-style APL2 */ |
| 975 | + *hSession->output.ptr++ = 0xc3; | ||
| 976 | + *hSession->output.ptr++ = 0x01; | ||
| 977 | + *hSession->output.ptr++ = 0x36; | ||
| 971 | } | 978 | } |
| 972 | #if defined(X3270_DBCS) /*[*/ | 979 | #if defined(X3270_DBCS) /*[*/ |
| 973 | if (dbcs) | 980 | if (dbcs) |
| 974 | { | 981 | { |
| 975 | - *hSession->obptr++ = 0x80; /* SET 0x80: */ | ||
| 976 | - *hSession->obptr++ = 0x20; /* FLAGS: DBCS */ | ||
| 977 | - *hSession->obptr++ = 0xf8; /* LCID: 0xf8 */ | ||
| 978 | - *hSession->obptr++ = *char_width * 2; /* SW */ | ||
| 979 | - *hSession->obptr++ = *char_height; /* SH */ | ||
| 980 | - *hSession->obptr++ = 0x41; /* SUBSN */ | ||
| 981 | - *hSession->obptr++ = 0x7f; /* SUBSN */ | ||
| 982 | - SET32(hSession->obptr, cgcsgid_dbcs); /* CGCSGID */ | 982 | + *hSession->output.ptr++ = 0x80; /* SET 0x80: */ |
| 983 | + *hSession->output.ptr++ = 0x20; /* FLAGS: DBCS */ | ||
| 984 | + *hSession->output.ptr++ = 0xf8; /* LCID: 0xf8 */ | ||
| 985 | + *hSession->output.ptr++ = *char_width * 2; /* SW */ | ||
| 986 | + *hSession->output.ptr++ = *char_height; /* SH */ | ||
| 987 | + *hSession->output.ptr++ = 0x41; /* SUBSN */ | ||
| 988 | + *hSession->output.ptr++ = 0x7f; /* SUBSN */ | ||
| 989 | + SET32(hSession->output.ptr, cgcsgid_dbcs); /* CGCSGID */ | ||
| 983 | } | 990 | } |
| 984 | #endif /*]*/ | 991 | #endif /*]*/ |
| 985 | } | 992 | } |
| @@ -991,10 +998,10 @@ static void do_qr_ddm(H3270 *hSession) | @@ -991,10 +998,10 @@ static void do_qr_ddm(H3270 *hSession) | ||
| 991 | 998 | ||
| 992 | trace_ds(hSession,"> QueryReply(DistributedDataManagement)\n"); | 999 | trace_ds(hSession,"> QueryReply(DistributedDataManagement)\n"); |
| 993 | space3270out(hSession,8); | 1000 | space3270out(hSession,8); |
| 994 | - SET16(hSession->obptr,0); /* set reserved field to 0 */ | ||
| 995 | - SET16(hSession->obptr, hSession->dft_buffersize); /* set inbound length limit INLIM */ | ||
| 996 | - SET16(hSession->obptr, hSession->dft_buffersize); /* set outbound length limit OUTLIM */ | ||
| 997 | - SET16(hSession->obptr, 0x0101); /* NSS=01, DDMSS=01 */ | 1001 | + SET16(hSession->output.ptr,0); /* set reserved field to 0 */ |
| 1002 | + SET16(hSession->output.ptr, hSession->dft_buffersize); /* set inbound length limit INLIM */ | ||
| 1003 | + SET16(hSession->output.ptr, hSession->dft_buffersize); /* set outbound length limit OUTLIM */ | ||
| 1004 | + SET16(hSession->output.ptr, 0x0101); /* NSS=01, DDMSS=01 */ | ||
| 998 | } | 1005 | } |
| 999 | #endif /*]*/ | 1006 | #endif /*]*/ |
| 1000 | 1007 | ||
| @@ -1002,15 +1009,15 @@ static void do_qr_imp_part(H3270 *hSession) | @@ -1002,15 +1009,15 @@ static void do_qr_imp_part(H3270 *hSession) | ||
| 1002 | { | 1009 | { |
| 1003 | trace_ds(hSession,"> QueryReply(ImplicitPartition)\n"); | 1010 | trace_ds(hSession,"> QueryReply(ImplicitPartition)\n"); |
| 1004 | space3270out(hSession,13); | 1011 | space3270out(hSession,13); |
| 1005 | - *hSession->obptr++ = 0x0; /* reserved */ | ||
| 1006 | - *hSession->obptr++ = 0x0; | ||
| 1007 | - *hSession->obptr++ = 0x0b; /* length of display size */ | ||
| 1008 | - *hSession->obptr++ = 0x01; /* "implicit partition size" */ | ||
| 1009 | - *hSession->obptr++ = 0x00; /* reserved */ | ||
| 1010 | - SET16(hSession->obptr, 80); /* implicit partition width */ | ||
| 1011 | - SET16(hSession->obptr, 24); /* implicit partition height */ | ||
| 1012 | - SET16(hSession->obptr, hSession->max.cols); /* alternate height */ | ||
| 1013 | - SET16(hSession->obptr, hSession->max.rows); /* alternate width */ | 1012 | + *hSession->output.ptr++ = 0x0; /* reserved */ |
| 1013 | + *hSession->output.ptr++ = 0x0; | ||
| 1014 | + *hSession->output.ptr++ = 0x0b; /* length of display size */ | ||
| 1015 | + *hSession->output.ptr++ = 0x01; /* "implicit partition size" */ | ||
| 1016 | + *hSession->output.ptr++ = 0x00; /* reserved */ | ||
| 1017 | + SET16(hSession->output.ptr, 80); /* implicit partition width */ | ||
| 1018 | + SET16(hSession->output.ptr, 24); /* implicit partition height */ | ||
| 1019 | + SET16(hSession->output.ptr, hSession->max.cols); /* alternate height */ | ||
| 1020 | + SET16(hSession->output.ptr, hSession->max.rows); /* alternate width */ | ||
| 1014 | } | 1021 | } |
| 1015 | 1022 | ||
| 1016 | static void query_reply_end(H3270 *hSession) | 1023 | static void query_reply_end(H3270 *hSession) |
src/core/telnet.c
| @@ -2144,20 +2144,20 @@ void space3270out(H3270 *hSession, int n) | @@ -2144,20 +2144,20 @@ void space3270out(H3270 *hSession, int n) | ||
| 2144 | unsigned nc = 0; /* amount of data currently in obuf */ | 2144 | unsigned nc = 0; /* amount of data currently in obuf */ |
| 2145 | unsigned more = 0; | 2145 | unsigned more = 0; |
| 2146 | 2146 | ||
| 2147 | - if (hSession->obuf_size) | ||
| 2148 | - nc = hSession->obptr - hSession->obuf; | 2147 | + if (hSession->output.length) |
| 2148 | + nc = hSession->output.ptr - hSession->output.buf; | ||
| 2149 | 2149 | ||
| 2150 | - while ((nc + n + EH_SIZE) > (hSession->obuf_size + more)) | 2150 | + while ((nc + n + EH_SIZE) > (hSession->output.length + more)) |
| 2151 | { | 2151 | { |
| 2152 | more += BUFSIZ; | 2152 | more += BUFSIZ; |
| 2153 | } | 2153 | } |
| 2154 | 2154 | ||
| 2155 | if (more) | 2155 | if (more) |
| 2156 | { | 2156 | { |
| 2157 | - hSession->obuf_size += more; | ||
| 2158 | - hSession->obuf_base = (unsigned char *)Realloc((char *) hSession->obuf_base,hSession->obuf_size); | ||
| 2159 | - hSession->obuf = hSession->obuf_base + EH_SIZE; | ||
| 2160 | - hSession->obptr = hSession->obuf + nc; | 2157 | + hSession->output.length += more; |
| 2158 | + hSession->output.base = (unsigned char *)Realloc((char *) hSession->output.base,hSession->output.length); | ||
| 2159 | + hSession->output.buf = hSession->output.base + EH_SIZE; | ||
| 2160 | + hSession->output.ptr = hSession->output.buf + nc; | ||
| 2161 | } | 2161 | } |
| 2162 | } | 2162 | } |
| 2163 | 2163 | ||
| @@ -2342,7 +2342,7 @@ void net_output(H3270 *hSession) | @@ -2342,7 +2342,7 @@ void net_output(H3270 *hSession) | ||
| 2342 | unsigned char *nxoptr, *xoptr; | 2342 | unsigned char *nxoptr, *xoptr; |
| 2343 | 2343 | ||
| 2344 | #if defined(X3270_TN3270E) | 2344 | #if defined(X3270_TN3270E) |
| 2345 | - #define BSTART ((IN_TN3270E || IN_SSCP) ? hSession->obuf_base : hSession->obuf) | 2345 | + #define BSTART ((IN_TN3270E || IN_SSCP) ? hSession->output.base : hSession->output.buf) |
| 2346 | #else | 2346 | #else |
| 2347 | #define BSTART obuf | 2347 | #define BSTART obuf |
| 2348 | #endif | 2348 | #endif |
| @@ -2351,7 +2351,7 @@ void net_output(H3270 *hSession) | @@ -2351,7 +2351,7 @@ void net_output(H3270 *hSession) | ||
| 2351 | /* Set the TN3720E header. */ | 2351 | /* Set the TN3720E header. */ |
| 2352 | if (IN_TN3270E || IN_SSCP) | 2352 | if (IN_TN3270E || IN_SSCP) |
| 2353 | { | 2353 | { |
| 2354 | - tn3270e_header *h = (tn3270e_header *) hSession->obuf_base; | 2354 | + tn3270e_header *h = (tn3270e_header *) hSession->output.base; |
| 2355 | 2355 | ||
| 2356 | /* Check for sending a TN3270E response. */ | 2356 | /* Check for sending a TN3270E response. */ |
| 2357 | if (hSession->response_required == TN3270E_RSF_ALWAYS_RESPONSE) | 2357 | if (hSession->response_required == TN3270E_RSF_ALWAYS_RESPONSE) |
| @@ -2374,7 +2374,7 @@ void net_output(H3270 *hSession) | @@ -2374,7 +2374,7 @@ void net_output(H3270 *hSession) | ||
| 2374 | #endif /*]*/ | 2374 | #endif /*]*/ |
| 2375 | 2375 | ||
| 2376 | /* Reallocate the expanded output buffer. */ | 2376 | /* Reallocate the expanded output buffer. */ |
| 2377 | - while (xobuf_len < (hSession->obptr - BSTART + 1) * 2) | 2377 | + while (xobuf_len < (hSession->output.ptr - BSTART + 1) * 2) |
| 2378 | { | 2378 | { |
| 2379 | xobuf_len += BUFSZ; | 2379 | xobuf_len += BUFSZ; |
| 2380 | need_resize++; | 2380 | need_resize++; |
| @@ -2388,7 +2388,7 @@ void net_output(H3270 *hSession) | @@ -2388,7 +2388,7 @@ void net_output(H3270 *hSession) | ||
| 2388 | /* Copy and expand IACs. */ | 2388 | /* Copy and expand IACs. */ |
| 2389 | xoptr = xobuf; | 2389 | xoptr = xobuf; |
| 2390 | nxoptr = BSTART; | 2390 | nxoptr = BSTART; |
| 2391 | - while (nxoptr < hSession->obptr) | 2391 | + while (nxoptr < hSession->output.ptr) |
| 2392 | { | 2392 | { |
| 2393 | if ((*xoptr++ = *nxoptr++) == IAC) | 2393 | if ((*xoptr++ = *nxoptr++) == IAC) |
| 2394 | { | 2394 | { |
src/include/lib3270-internals.h
| @@ -488,8 +488,6 @@ struct _h3270 | @@ -488,8 +488,6 @@ struct _h3270 | ||
| 488 | // Telnet.c | 488 | // Telnet.c |
| 489 | unsigned char * ibuf; | 489 | unsigned char * ibuf; |
| 490 | int ibuf_size; /**< @brief size of ibuf */ | 490 | int ibuf_size; /**< @brief size of ibuf */ |
| 491 | - unsigned char * obuf; /**< @brief 3270 output buffer */ | ||
| 492 | - unsigned char * obptr; | ||
| 493 | time_t ns_time; | 491 | time_t ns_time; |
| 494 | int ns_brcvd; | 492 | int ns_brcvd; |
| 495 | int ns_rrcvd; | 493 | int ns_rrcvd; |
| @@ -529,8 +527,15 @@ struct _h3270 | @@ -529,8 +527,15 @@ struct _h3270 | ||
| 529 | 527 | ||
| 530 | // 3270 input buffer | 528 | // 3270 input buffer |
| 531 | unsigned char * ibptr; | 529 | unsigned char * ibptr; |
| 532 | - unsigned char * obuf_base; | ||
| 533 | - int obuf_size; | 530 | + |
| 531 | + // Output buffer. | ||
| 532 | + struct | ||
| 533 | + { | ||
| 534 | + unsigned char * buf; ///< @brief 3270 output buffer */ | ||
| 535 | + unsigned char * base; | ||
| 536 | + int length; ///< @brief Length of the output buffer. | ||
| 537 | + unsigned char * ptr; | ||
| 538 | + } output; | ||
| 534 | 539 | ||
| 535 | // network input buffer | 540 | // network input buffer |
| 536 | unsigned char * sbbuf; | 541 | unsigned char * sbbuf; |