Commit 6a4e8342a2efe817d26fcab2cb0ac6f7653f8b8d

Authored by Perry Werneck
1 parent d61ed387

Refactoring output buffer management.

@@ -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,&current_fg,&current_bg,&current_gr,&current_cs,&any); 1019 insert_sa(hSession,baddr,&current_fg,&current_bg,&current_gr,&current_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);
@@ -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;