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 | 344 | #---[ Debug Targets ]-------------------------------------------------------------------- |
| 345 | 345 | |
| 346 | 346 | Debug: \ |
| 347 | - $(BINDBG)/$(LIBNAME)@EXEEXT@ | |
| 347 | + $(BINDBG)/lib3270@EXEEXT@ | |
| 348 | 348 | |
| 349 | -$(BINDBG)/$(LIBNAME)@EXEEXT@: \ | |
| 349 | +$(BINDBG)/lib3270@EXEEXT@: \ | |
| 350 | 350 | $(foreach SRC, $(basename $(TEST_SOURCES)), $(OBJDBG)/$(SRC).o) \ |
| 351 | 351 | $(BINDBG)/$(SONAME) |
| 352 | 352 | |
| ... | ... | @@ -361,19 +361,19 @@ $(BINDBG)/$(LIBNAME)@EXEEXT@: \ |
| 361 | 361 | $(LIBS) |
| 362 | 362 | |
| 363 | 363 | run: \ |
| 364 | - $(BINDBG)/$(LIBNAME)@EXEEXT@ | |
| 364 | + $(BINDBG)/lib3270@EXEEXT@ | |
| 365 | 365 | |
| 366 | 366 | ifeq ($(VALGRIND),no) |
| 367 | 367 | |
| 368 | 368 | @LD_LIBRARY_PATH=$(BINDBG) \ |
| 369 | - $(BINDBG)/$(LIBNAME)@EXEEXT@ | |
| 369 | + $(BINDBG)/lib3270@EXEEXT@ | |
| 370 | 370 | |
| 371 | 371 | else |
| 372 | 372 | @touch valgrind.suppression |
| 373 | 373 | |
| 374 | 374 | @LD_LIBRARY_PATH=$(BINDBG) \ |
| 375 | 375 | $(VALGRIND) --leak-check=full --track-origins=yes --gen-suppressions=all --suppressions=valgrind.suppression \ |
| 376 | - $(BINDBG)/$(LIBNAME)@EXEEXT@ | |
| 376 | + $(BINDBG)/lib3270@EXEEXT@ | |
| 377 | 377 | endif |
| 378 | 378 | |
| 379 | 379 | $(BINDBG)/$(SONAME): \ | ... | ... |
src/core/ctlr.c
| ... | ... | @@ -685,9 +685,9 @@ static void insert_sa1(H3270 *hSession, unsigned char attr, unsigned char value, |
| 685 | 685 | return; |
| 686 | 686 | *currentp = value; |
| 687 | 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 | 691 | if (*anyp) |
| 692 | 692 | trace_ds(hSession,"'"); |
| 693 | 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 | 763 | #endif /*]*/ |
| 764 | 764 | |
| 765 | 765 | trace_ds(hSession,"> "); |
| 766 | - hSession->obptr = hSession->obuf; | |
| 766 | + hSession->output.ptr = hSession->output.buf; | |
| 767 | 767 | |
| 768 | 768 | switch (aid_byte) |
| 769 | 769 | { |
| 770 | 770 | case AID_SYSREQ: /* test request */ |
| 771 | 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 | 776 | trace_ds(hSession,"SYSREQ"); |
| 777 | 777 | break; |
| 778 | 778 | |
| ... | ... | @@ -793,13 +793,13 @@ void ctlr_read_modified(H3270 *hSession, unsigned char aid_byte, Boolean all) |
| 793 | 793 | if (!IN_SSCP) |
| 794 | 794 | { |
| 795 | 795 | space3270out(hSession,3); |
| 796 | - *hSession->obptr++ = aid_byte; | |
| 796 | + *hSession->output.ptr++ = aid_byte; | |
| 797 | 797 | trace_ds(hSession,"%s",see_aid(aid_byte)); |
| 798 | 798 | |
| 799 | 799 | if (short_read) |
| 800 | 800 | goto rm_done; |
| 801 | 801 | |
| 802 | - ENCODE_BADDR(hSession->obptr, hSession->cursor_addr); | |
| 802 | + ENCODE_BADDR(hSession->output.ptr, hSession->cursor_addr); | |
| 803 | 803 | trace_ds(hSession,"%s",rcba(hSession,hSession->cursor_addr)); |
| 804 | 804 | } |
| 805 | 805 | else |
| ... | ... | @@ -829,8 +829,8 @@ void ctlr_read_modified(H3270 *hSession, unsigned char aid_byte, Boolean all) |
| 829 | 829 | |
| 830 | 830 | INC_BA(baddr); |
| 831 | 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 | 834 | trace_ds(hSession," SetBufferAddress%s (Cols: %d Rows: %d)", rcba(hSession,baddr), hSession->view.cols, hSession->view.rows); |
| 835 | 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 | 841 | if (hSession->ea_buf[baddr].cs & CS_GE) |
| 842 | 842 | { |
| 843 | 843 | space3270out(hSession,1); |
| 844 | - *hSession->obptr++ = ORDER_GE; | |
| 844 | + *hSession->output.ptr++ = ORDER_GE; | |
| 845 | 845 | if (any) |
| 846 | 846 | trace_ds(hSession,"'"); |
| 847 | 847 | trace_ds(hSession," GraphicEscape"); |
| 848 | 848 | any = False; |
| 849 | 849 | } |
| 850 | 850 | space3270out(hSession,1); |
| 851 | - *hSession->obptr++ = hSession->ea_buf[baddr].cc; | |
| 851 | + *hSession->output.ptr++ = hSession->ea_buf[baddr].cc; | |
| 852 | 852 | if (!any) |
| 853 | 853 | trace_ds(hSession," '"); |
| 854 | 854 | |
| ... | ... | @@ -890,7 +890,7 @@ void ctlr_read_modified(H3270 *hSession, unsigned char aid_byte, Boolean all) |
| 890 | 890 | if (hSession->ea_buf[baddr].cs & CS_GE) |
| 891 | 891 | { |
| 892 | 892 | space3270out(hSession,1); |
| 893 | - *hSession->obptr++ = ORDER_GE; | |
| 893 | + *hSession->output.ptr++ = ORDER_GE; | |
| 894 | 894 | if (any) |
| 895 | 895 | trace_ds(hSession,"' "); |
| 896 | 896 | trace_ds(hSession," GraphicEscape "); |
| ... | ... | @@ -898,7 +898,7 @@ void ctlr_read_modified(H3270 *hSession, unsigned char aid_byte, Boolean all) |
| 898 | 898 | } |
| 899 | 899 | |
| 900 | 900 | space3270out(hSession,1); |
| 901 | - *hSession->obptr++ = hSession->ea_buf[baddr].cc; | |
| 901 | + *hSession->output.ptr++ = hSession->ea_buf[baddr].cc; | |
| 902 | 902 | if (!any) |
| 903 | 903 | trace_ds(hSession,"%s","'"); |
| 904 | 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 | 949 | #endif /*]*/ |
| 950 | 950 | |
| 951 | 951 | trace_ds(hSession,"> "); |
| 952 | - hSession->obptr = hSession->obuf; | |
| 952 | + hSession->output.ptr = hSession->output.buf; | |
| 953 | 953 | |
| 954 | 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 | 957 | trace_ds(hSession,"%s%s", see_aid(aid_byte), rcba(hSession,hSession->cursor_addr)); |
| 958 | 958 | |
| 959 | 959 | baddr = 0; |
| ... | ... | @@ -963,18 +963,18 @@ void ctlr_read_buffer(H3270 *hSession, unsigned char aid_byte) |
| 963 | 963 | if (hSession->reply_mode == SF_SRM_FIELD) |
| 964 | 964 | { |
| 965 | 965 | space3270out(hSession,2); |
| 966 | - *hSession->obptr++ = ORDER_SF; | |
| 966 | + *hSession->output.ptr++ = ORDER_SF; | |
| 967 | 967 | } |
| 968 | 968 | else |
| 969 | 969 | { |
| 970 | 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 | 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 | 979 | if (any) |
| 980 | 980 | trace_ds(hSession,"'"); |
| ... | ... | @@ -986,32 +986,32 @@ void ctlr_read_buffer(H3270 *hSession, unsigned char aid_byte) |
| 986 | 986 | { |
| 987 | 987 | if (hSession->ea_buf[baddr].fg) { |
| 988 | 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 | 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 | 994 | if (hSession->ea_buf[baddr].bg) { |
| 995 | 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 | 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 | 1001 | if (hSession->ea_buf[baddr].gr) { |
| 1002 | 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 | 1005 | trace_ds(hSession,"%s", see_efa(XA_HIGHLIGHTING, |
| 1006 | 1006 | hSession->ea_buf[baddr].gr | 0xf0)); |
| 1007 | - (*(hSession->obuf + attr_count))++; | |
| 1007 | + (*(hSession->output.buf + attr_count))++; | |
| 1008 | 1008 | } |
| 1009 | 1009 | if (hSession->ea_buf[baddr].cs & CS_MASK) { |
| 1010 | 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 | 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 | 1017 | any = False; |
| ... | ... | @@ -1019,14 +1019,14 @@ void ctlr_read_buffer(H3270 *hSession, unsigned char aid_byte) |
| 1019 | 1019 | insert_sa(hSession,baddr,¤t_fg,¤t_bg,¤t_gr,¤t_cs,&any); |
| 1020 | 1020 | if (hSession->ea_buf[baddr].cs & CS_GE) { |
| 1021 | 1021 | space3270out(hSession,1); |
| 1022 | - *hSession->obptr++ = ORDER_GE; | |
| 1022 | + *hSession->output.ptr++ = ORDER_GE; | |
| 1023 | 1023 | if (any) |
| 1024 | 1024 | trace_ds(hSession,"'"); |
| 1025 | 1025 | trace_ds(hSession," GraphicEscape"); |
| 1026 | 1026 | any = False; |
| 1027 | 1027 | } |
| 1028 | 1028 | space3270out(hSession,1); |
| 1029 | - *hSession->obptr++ = hSession->ea_buf[baddr].cc; | |
| 1029 | + *hSession->output.ptr++ = hSession->ea_buf[baddr].cc; | |
| 1030 | 1030 | if (hSession->ea_buf[baddr].cc <= 0x3f || |
| 1031 | 1031 | hSession->ea_buf[baddr].cc == 0xff) { |
| 1032 | 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 | 201 | |
| 202 | 202 | /* Acknowledge the Open. */ |
| 203 | 203 | trace_ds(hSession,"> WriteStructuredField FileTransferData OpenAck\n"); |
| 204 | - hSession->obptr = hSession->obuf; | |
| 204 | + hSession->output.ptr = hSession->output.buf; | |
| 205 | 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 | 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 | 338 | |
| 339 | 339 | /* Send an acknowledgement frame back. */ |
| 340 | 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 | 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 | 349 | ft->recnum++; |
| 350 | 350 | net_output(hSession); |
| 351 | 351 | } |
| ... | ... | @@ -378,7 +378,7 @@ static void dft_get_request(H3270 *hSession) |
| 378 | 378 | set_dft_buffersize(hSession); |
| 379 | 379 | space3270out(hSession,hSession->dft_buffersize); |
| 380 | 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 | 383 | while (!ft->dft_eof && numbytes) |
| 384 | 384 | { |
| ... | ... | @@ -456,22 +456,22 @@ static void dft_get_request(H3270 *hSession) |
| 456 | 456 | } |
| 457 | 457 | |
| 458 | 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 | 464 | if (total_read) |
| 465 | 465 | { |
| 466 | 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 | 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 | 476 | ft->ft_length += total_read; |
| 477 | 477 | |
| ... | ... | @@ -484,26 +484,26 @@ static void dft_get_request(H3270 *hSession) |
| 484 | 484 | else |
| 485 | 485 | { |
| 486 | 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 | 492 | ft->dft_eof = 1; |
| 493 | 493 | } |
| 494 | 494 | |
| 495 | 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 | 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 | 501 | if (ft->dft_savebuf_len > ft->dft_savebuf_max) |
| 502 | 502 | { |
| 503 | 503 | ft->dft_savebuf_max = ft->dft_savebuf_len; |
| 504 | 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 | 507 | hSession->aid = AID_SF; |
| 508 | 508 | |
| 509 | 509 | /* Write the data. */ |
| ... | ... | @@ -520,12 +520,12 @@ static void dft_close_request(H3270 *hSession) |
| 520 | 520 | */ |
| 521 | 521 | trace_ds(hSession," Close\n"); |
| 522 | 522 | trace_ds(hSession,"> WriteStructuredField FileTransferData CloseAck\n"); |
| 523 | - hSession->obptr = hSession->obuf; | |
| 523 | + hSession->output.ptr = hSession->output.buf; | |
| 524 | 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 | 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 | 543 | |
| 544 | 544 | trace_ds(hSession,"> WriteStructuredField FileTransferData Error\n"); |
| 545 | 545 | |
| 546 | - hSession->obptr = hSession->obuf; | |
| 546 | + hSession->output.ptr = hSession->output.buf; | |
| 547 | 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 | 555 | net_output(hSession); |
| 556 | 556 | |
| 557 | 557 | /* Update the pop-up and state. */ |
| ... | ... | @@ -581,10 +581,10 @@ void dft_read_modified(H3270 *hSession) |
| 581 | 581 | if(ft->dft_savebuf_len) |
| 582 | 582 | { |
| 583 | 583 | trace_ds(hSession,"> WriteStructuredField FileTransferData\n"); |
| 584 | - hSession->obptr = hSession->obuf; | |
| 584 | + hSession->output.ptr = hSession->output.buf; | |
| 585 | 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 | 588 | net_output(hSession); |
| 589 | 589 | } |
| 590 | 590 | } | ... | ... |
src/core/rpq.c
| ... | ... | @@ -146,14 +146,14 @@ void do_qr_rpqnames(H3270 *hSession) |
| 146 | 146 | */ |
| 147 | 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 | 154 | /* Create fixed length portion - program id: x3270 */ |
| 155 | 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 | 157 | remaining--; |
| 158 | 158 | } |
| 159 | 159 | |
| ... | ... | @@ -168,9 +168,9 @@ void do_qr_rpqnames(H3270 *hSession) |
| 168 | 168 | |
| 169 | 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 | 176 | * Adjust remaining space by the term prefix size so each case |
| ... | ... | @@ -183,18 +183,18 @@ void do_qr_rpqnames(H3270 *hSession) |
| 183 | 183 | switch (term_id) /* build the term based on id */ |
| 184 | 184 | { |
| 185 | 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 | 187 | break; |
| 188 | 188 | |
| 189 | 189 | case RPQ_TIMEZONE: /* UTC time offset */ |
| 190 | 190 | omit_due_space_limit = (remaining < 2); |
| 191 | 191 | if (!omit_due_space_limit) |
| 192 | - SET16(hSession->obptr, get_rpq_timezone(hSession)); | |
| 192 | + SET16(hSession->output.ptr, get_rpq_timezone(hSession)); | |
| 193 | 193 | break; |
| 194 | 194 | |
| 195 | 195 | case RPQ_ADDRESS: /* Workstation address */ |
| 196 | 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 | 198 | #endif /*]*/ |
| 199 | 199 | break; |
| 200 | 200 | |
| ... | ... | @@ -205,7 +205,7 @@ void do_qr_rpqnames(H3270 *hSession) |
| 205 | 205 | { |
| 206 | 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 | 211 | break; |
| ... | ... | @@ -217,7 +217,7 @@ void do_qr_rpqnames(H3270 *hSession) |
| 217 | 217 | { |
| 218 | 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 | 221 | + (*(build_rpq_timestamp+i+1) - '0'); |
| 222 | 222 | } |
| 223 | 223 | } |
| ... | ... | @@ -239,14 +239,14 @@ void do_qr_rpqnames(H3270 *hSession) |
| 239 | 239 | * adjust space remaining. |
| 240 | 240 | * obptr now points at "next available byte". |
| 241 | 241 | */ |
| 242 | - x = hSession->obptr-p_term; | |
| 242 | + x = hSession->output.ptr-p_term; | |
| 243 | 243 | if (x > TERM_PREFIX_SIZE) { |
| 244 | 244 | *p_term = x; |
| 245 | 245 | remaining -= x; /* This includes length and id fields, |
| 246 | 246 | correction below */ |
| 247 | 247 | } else { |
| 248 | 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 | 252 | * When we calculated the length of the term, a few lines |
| ... | ... | @@ -268,7 +268,7 @@ void do_qr_rpqnames(H3270 *hSession) |
| 268 | 268 | } |
| 269 | 269 | |
| 270 | 270 | /* Fill in overall length of RPQNAME info */ |
| 271 | - *rpql = (hSession->obptr - rpql); | |
| 271 | + *rpql = (hSession->output.ptr - rpql); | |
| 272 | 272 | |
| 273 | 273 | rpq_dump_warnings(hSession); |
| 274 | 274 | } | ... | ... |
src/core/session.c
| ... | ... | @@ -140,7 +140,7 @@ void lib3270_session_free(H3270 *h) |
| 140 | 140 | release_pointer(h->text); |
| 141 | 141 | release_pointer(h->zero_buf); |
| 142 | 142 | |
| 143 | - release_pointer(h->obuf_base); | |
| 143 | + release_pointer(h->output.base); | |
| 144 | 144 | |
| 145 | 145 | release_pointer(h->sbbuf); |
| 146 | 146 | release_pointer(h->tabs); | ... | ... |
src/core/sf.c
| ... | ... | @@ -93,12 +93,19 @@ static void query_reply_start(H3270 *hSession); |
| 93 | 93 | static void do_query_reply(H3270 *hSession, unsigned char code); |
| 94 | 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 | 110 | #if defined(X3270_DBCS) /*[*/ |
| 104 | 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 | 699 | |
| 693 | 700 | static void query_reply_start(H3270 *hSession) |
| 694 | 701 | { |
| 695 | - hSession->obptr = hSession->obuf; | |
| 702 | + hSession->output.ptr = hSession->output.buf; | |
| 696 | 703 | space3270out(hSession,1); |
| 697 | - *hSession->obptr++ = AID_SF; | |
| 704 | + *hSession->output.ptr++ = AID_SF; | |
| 698 | 705 | qr_in_progress = True; |
| 699 | 706 | } |
| 700 | 707 | |
| ... | ... | @@ -721,13 +728,13 @@ static void do_query_reply(H3270 *hSession, unsigned char code) |
| 721 | 728 | |
| 722 | 729 | do |
| 723 | 730 | { |
| 724 | - int obptr0 = hSession->obptr - hSession->obuf; | |
| 731 | + int obptr0 = hSession->output.ptr - hSession->output.buf; | |
| 725 | 732 | Boolean full = True; |
| 726 | 733 | |
| 727 | 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 | 739 | more = False; |
| 733 | 740 | if (replies[i].single_fn) |
| ... | ... | @@ -741,12 +748,12 @@ static void do_query_reply(H3270 *hSession, unsigned char code) |
| 741 | 748 | unsigned char *obptr_len; |
| 742 | 749 | |
| 743 | 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 | 753 | SET16(obptr_len, len); |
| 747 | 754 | } else { |
| 748 | 755 | /* Back over the header. */ |
| 749 | - hSession->obptr -= 4; | |
| 756 | + hSession->output.ptr -= 4; | |
| 750 | 757 | } |
| 751 | 758 | } while (more); |
| 752 | 759 | } |
| ... | ... | @@ -771,7 +778,7 @@ static void do_qr_summary(H3270 *hSession) |
| 771 | 778 | #endif /*]*/ |
| 772 | 779 | trace_ds(hSession,"%s%s", comma, see_qcode(replies[i].code)); |
| 773 | 780 | comma = ","; |
| 774 | - *hSession->obptr++ = replies[i].code; | |
| 781 | + *hSession->output.ptr++ = replies[i].code; | |
| 775 | 782 | #if defined(X3270_DBCS) /*[*/ |
| 776 | 783 | } |
| 777 | 784 | #endif /*]*/ |
| ... | ... | @@ -785,11 +792,11 @@ static void do_qr_usable_area(H3270 *hSession) |
| 785 | 792 | |
| 786 | 793 | trace_ds(hSession,"> QueryReply(UsableArea)\n"); |
| 787 | 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 | 800 | num = display_widthMM(); |
| 794 | 801 | denom = display_width(); |
| 795 | 802 | while (!(num %2) && !(denom % 2)) |
| ... | ... | @@ -797,8 +804,8 @@ static void do_qr_usable_area(H3270 *hSession) |
| 797 | 804 | num /= 2; |
| 798 | 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 | 809 | num = display_heightMM(); |
| 803 | 810 | denom = display_height(); |
| 804 | 811 | while (!(num %2) && !(denom % 2)) |
| ... | ... | @@ -806,11 +813,11 @@ static void do_qr_usable_area(H3270 *hSession) |
| 806 | 813 | num /= 2; |
| 807 | 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 | 823 | static void do_qr_color(H3270 *hSession) |
| ... | ... | @@ -823,17 +830,17 @@ static void do_qr_color(H3270 *hSession) |
| 823 | 830 | color_max = (hSession->colors == 8) ? 8: 16; /* report on 8 or 16 colors */ |
| 824 | 831 | |
| 825 | 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 | 837 | for (i = 0xf1; i < 0xf1 + color_max - 1; i++) |
| 831 | 838 | { |
| 832 | - *hSession->obptr++ = i; | |
| 839 | + *hSession->output.ptr++ = i; | |
| 833 | 840 | if (hSession->m3279) |
| 834 | - *hSession->obptr++ = i; | |
| 841 | + *hSession->output.ptr++ = i; | |
| 835 | 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 | 848 | // Add background color. |
| 842 | 849 | if (hSession->m3279) { |
| 843 | 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 | 856 | #endif |
| 850 | 857 | */ |
| ... | ... | @@ -854,26 +861,26 @@ static void do_qr_highlighting(H3270 *hSession) |
| 854 | 861 | { |
| 855 | 862 | trace_ds(hSession,"> QueryReply(Highlighting)\n"); |
| 856 | 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 | 877 | static void do_qr_reply_modes(H3270 *hSession) |
| 871 | 878 | { |
| 872 | 879 | trace_ds(hSession,"> QueryReply(ReplyModes)\n"); |
| 873 | 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 | 886 | #if defined(X3270_DBCS) /*[*/ |
| ... | ... | @@ -882,13 +889,13 @@ static void do_qr_dbcs_asia(H3270 *hSession) |
| 882 | 889 | /* XXX: Should we support this, even when not in DBCS mode? */ |
| 883 | 890 | trace_ds(hSession,"> QueryReply(DbcsAsia)\n"); |
| 884 | 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 | 900 | #endif /*]*/ |
| 894 | 901 | |
| ... | ... | @@ -896,9 +903,9 @@ static void do_qr_alpha_part(H3270 *hSession) |
| 896 | 903 | { |
| 897 | 904 | trace_ds(hSession,"> QueryReply(AlphanumericPartitions)\n"); |
| 898 | 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 | 911 | static void do_qr_charsets(H3270 *hSession) |
| ... | ... | @@ -907,79 +914,79 @@ static void do_qr_charsets(H3270 *hSession) |
| 907 | 914 | space3270out(hSession,64); |
| 908 | 915 | #if defined(X3270_DBCS) /*[*/ |
| 909 | 916 | if (dbcs) |
| 910 | - *hSession->obptr++ = 0x8e; /* flags: GE, CGCSGID, DBCS */ | |
| 917 | + *hSession->output.ptr++ = 0x8e; /* flags: GE, CGCSGID, DBCS */ | |
| 911 | 918 | else |
| 912 | 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 | 929 | #if defined(X3270_DBCS) /*[*/ |
| 923 | 930 | if (dbcs) |
| 924 | - *hSession->obptr++ = 0x0b; /* DL (11 bytes) */ | |
| 931 | + *hSession->output.ptr++ = 0x0b; /* DL (11 bytes) */ | |
| 925 | 932 | else |
| 926 | 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 | 937 | #if defined(X3270_DBCS) /*[*/ |
| 931 | 938 | if (dbcs) |
| 932 | - *hSession->obptr++ = 0x00; /* FLAGS: non-load, single- | |
| 939 | + *hSession->output.ptr++ = 0x00; /* FLAGS: non-load, single- | |
| 933 | 940 | plane, single-bute */ |
| 934 | 941 | else |
| 935 | 942 | #endif /*]*/ |
| 936 | - *hSession->obptr++ = 0x10; /* FLAGS: non-loadable, | |
| 943 | + *hSession->output.ptr++ = 0x10; /* FLAGS: non-loadable, | |
| 937 | 944 | single-plane, single-byte, |
| 938 | 945 | no compare */ |
| 939 | - *hSession->obptr++ = 0x00; /* LCID 0 */ | |
| 946 | + *hSession->output.ptr++ = 0x00; /* LCID 0 */ | |
| 940 | 947 | #if defined(X3270_DBCS) /*[*/ |
| 941 | 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 | 954 | #endif /*]*/ |
| 948 | - SET32(hSession->obptr, hSession->charset.cgcsgid); /* CGCSGID */ | |
| 955 | + SET32(hSession->output.ptr, hSession->charset.cgcsgid); /* CGCSGID */ | |
| 949 | 956 | if (!*standard_font) |
| 950 | 957 | { |
| 951 | 958 | /* special 3270 font, includes APL */ |
| 952 | - *hSession->obptr++ = 0x01;/* SET 1: */ | |
| 959 | + *hSession->output.ptr++ = 0x01;/* SET 1: */ | |
| 953 | 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 | 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 | 965 | #if defined(X3270_DBCS) /*[*/ |
| 959 | 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 | 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 | 979 | #if defined(X3270_DBCS) /*[*/ |
| 973 | 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 | 991 | #endif /*]*/ |
| 985 | 992 | } |
| ... | ... | @@ -991,10 +998,10 @@ static void do_qr_ddm(H3270 *hSession) |
| 991 | 998 | |
| 992 | 999 | trace_ds(hSession,"> QueryReply(DistributedDataManagement)\n"); |
| 993 | 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 | 1006 | #endif /*]*/ |
| 1000 | 1007 | |
| ... | ... | @@ -1002,15 +1009,15 @@ static void do_qr_imp_part(H3270 *hSession) |
| 1002 | 1009 | { |
| 1003 | 1010 | trace_ds(hSession,"> QueryReply(ImplicitPartition)\n"); |
| 1004 | 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 | 1023 | static void query_reply_end(H3270 *hSession) | ... | ... |
src/core/telnet.c
| ... | ... | @@ -2144,20 +2144,20 @@ void space3270out(H3270 *hSession, int n) |
| 2144 | 2144 | unsigned nc = 0; /* amount of data currently in obuf */ |
| 2145 | 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 | 2152 | more += BUFSIZ; |
| 2153 | 2153 | } |
| 2154 | 2154 | |
| 2155 | 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 | 2342 | unsigned char *nxoptr, *xoptr; |
| 2343 | 2343 | |
| 2344 | 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 | 2346 | #else |
| 2347 | 2347 | #define BSTART obuf |
| 2348 | 2348 | #endif |
| ... | ... | @@ -2351,7 +2351,7 @@ void net_output(H3270 *hSession) |
| 2351 | 2351 | /* Set the TN3720E header. */ |
| 2352 | 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 | 2356 | /* Check for sending a TN3270E response. */ |
| 2357 | 2357 | if (hSession->response_required == TN3270E_RSF_ALWAYS_RESPONSE) |
| ... | ... | @@ -2374,7 +2374,7 @@ void net_output(H3270 *hSession) |
| 2374 | 2374 | #endif /*]*/ |
| 2375 | 2375 | |
| 2376 | 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 | 2379 | xobuf_len += BUFSZ; |
| 2380 | 2380 | need_resize++; |
| ... | ... | @@ -2388,7 +2388,7 @@ void net_output(H3270 *hSession) |
| 2388 | 2388 | /* Copy and expand IACs. */ |
| 2389 | 2389 | xoptr = xobuf; |
| 2390 | 2390 | nxoptr = BSTART; |
| 2391 | - while (nxoptr < hSession->obptr) | |
| 2391 | + while (nxoptr < hSession->output.ptr) | |
| 2392 | 2392 | { |
| 2393 | 2393 | if ((*xoptr++ = *nxoptr++) == IAC) |
| 2394 | 2394 | { | ... | ... |
src/include/lib3270-internals.h
| ... | ... | @@ -488,8 +488,6 @@ struct _h3270 |
| 488 | 488 | // Telnet.c |
| 489 | 489 | unsigned char * ibuf; |
| 490 | 490 | int ibuf_size; /**< @brief size of ibuf */ |
| 491 | - unsigned char * obuf; /**< @brief 3270 output buffer */ | |
| 492 | - unsigned char * obptr; | |
| 493 | 491 | time_t ns_time; |
| 494 | 492 | int ns_brcvd; |
| 495 | 493 | int ns_rrcvd; |
| ... | ... | @@ -529,8 +527,15 @@ struct _h3270 |
| 529 | 527 | |
| 530 | 528 | // 3270 input buffer |
| 531 | 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 | 540 | // network input buffer |
| 536 | 541 | unsigned char * sbbuf; | ... | ... |