mcgrew@aramis.rutgers.edu (Charles Mcgrew) (08/25/90)
Submitted-by: zjat02@trc.amoco.com (Jon A. Tankersley) Posting-number: Volume 2, Issue 17 Archive-name: 3270tool/enhance01 Enhancements to 3270tool to support model 3-5 3278 terminals. Robert Viduya isn't supporting this package anymore (he uses X now). I don't know if I can support it either (we're moving to X), but I can answer some questions on it. Here is Robert's 'disclaimer': >Perhaps you might want to post your changes to sun-spots and/or comp.sys.sun? >That way those two archives can get updated. I mentioned in the notes I >included when I distributed the program that I'd written the program a >year or two ago (it took me that long to get permission to release it) >and that I'd since stopped using SunView and had switched to X. At this >point, I really don't feel comfortable at all acting as a clearinghouse >for 3270tool because I no longer run in an environment that allows me >to fully test out any changes people send me. *** 3270.h Thu Jul 26 13:30:53 1990 --- ../3270.h Wed Aug 1 13:15:47 1990 *************** *** 36,43 **** #define ORDER_YALE 0x2B /* Yale sub command */ /* screen dimensions */ ! #define COLS 80 ! #define ROWS 24 #define CHAR_WIDTH (ibmfont->pf_char[0x10].pc_pr->pr_size.x) #define CHAR_HEIGHT (ibmfont->pf_char[0x10].pc_pr->pr_size.y) --- 36,44 ---- #define ORDER_YALE 0x2B /* Yale sub command */ /* screen dimensions */ ! /* #define COLS 80 */ ! /* #define ROWS 24 */ ! extern int COLS, ROWS, ROWSCOLS; #define CHAR_WIDTH (ibmfont->pf_char[0x10].pc_pr->pr_size.x) #define CHAR_HEIGHT (ibmfont->pf_char[0x10].pc_pr->pr_size.y) *************** *** 53,59 **** #define ROWCOL_TO_BA(r,c) (((r) * COLS) + c) #define INC_BA(ba) \ { \ ! if (++ba >= (COLS * ROWS)) \ ba = 0; \ } --- 54,60 ---- #define ROWCOL_TO_BA(r,c) (((r) * COLS) + c) #define INC_BA(ba) \ { \ ! if (++ba >= (ROWSCOLS)) \ ba = 0; \ } *************** *** 60,66 **** #define DEC_BA(ba) \ { \ if (--ba < 0) \ ! ba = (COLS * ROWS) - 1; \ } --- 61,67 ---- #define DEC_BA(ba) \ { \ if (--ba < 0) \ ! ba = (ROWSCOLS) - 1; \ } *** 3270tool.1 Thu Jul 26 14:24:49 1990 --- ../3270tool.1 Wed Aug 1 17:28:40 1990 *************** *** 1,15 **** '\" t ! .TH 3270TOOL 1 "March 28, 1989" .SH NAME 3270tool \- IBM remote host access tool .SH SYNOPSIS ! .B 3270tool host .SH DESCRIPTION .I 3270tool opens a telnet connection to the given IBM host in a SunView window. ! The created window provides a fairly complete IBM 3278 Model 2 terminal ! emulation. .I 3270tool is similar to .I tn3270 (1) --- 1,19 ---- '\" t ! .TH 3270TOOL 1 "July 26, 1990" .SH NAME 3270tool \- IBM remote host access tool .SH SYNOPSIS ! .B 3270tool [ \-m 2|3|4|5 ] host .SH DESCRIPTION .I 3270tool opens a telnet connection to the given IBM host in a SunView window. ! The created window provides a fairly complete IBM 3278 terminal emulation. ! By specifying the ! .b \-m ! flag you can chose other IBM 3278 model layouts. Model 2 has 24x80 screen, ! Model 3 has 32x80, Model 4 has 43x80, and Model 5 has 27x132 screen. ! The default is a Model 4. .I 3270tool is similar to .I tn3270 (1) *** 3270tool.c Thu Jul 26 13:30:39 1990 --- ../3270tool.c Wed Aug 1 17:21:59 1990 *************** *** 25,31 **** --- 25,48 ---- int net_sock; extern Notify_value net_input (); + /* + * Modifications for variable sized screens..... + * 07/27/90 jat + */ + int COLS, ROWS, ROWSCOLS; + u_char *screen_buf; + u_char *prim_seln; /* enough for screen + eols */ + u_char *shelf_seln; + u_char ttype_model; + extern int errno; + extern char *optarg; + extern int optind, opterr; + int c = 0, + model, + errflg = 0; + static char usage[] = { "3270tool: Usage 3270tool [ -m 2|3|4|5 ] ibm-host" }; + main (argc, argv) int argc; *************** *** 41,51 **** FRAME_ARGC_PTR_ARGV, &argc, argv, 0 ); if (argc <= 1) { ! (void) fprintf (stderr, "usage: 3270tool ibm-host\n"); exit (1); } ! net_sock = connect_net (argv[1]); screen_init (); key_panel_init (); menu_init (); --- 58,115 ---- FRAME_ARGC_PTR_ARGV, &argc, argv, 0 ); + + /* + * check for model type + */ + COLS=80; ROWS=43; /* default to type 4 */ + ttype_model='4'; /* and model type to 4 */ + ROWSCOLS=ROWS*COLS; /* save some time here */ + while((c = getopt(argc, argv, "m:")) != EOF) { + switch(c) { + case 'm': + model=atoi(optarg); + switch(model) { + case 2: COLS=80; ROWS=24; /* type 2 */ + ROWSCOLS=ROWS*COLS; + ttype_model = *optarg; + break; + case 3: COLS=80; ROWS=32; /* type 3 */ + ROWSCOLS=ROWS*COLS; + ttype_model = *optarg; + break; + case 4: COLS=80; ROWS=43; /* type 4 */ + ROWSCOLS=ROWS*COLS; + ttype_model = *optarg; + break; + case 5: COLS=132; ROWS=27; /* type 5 */ + ROWSCOLS=ROWS*COLS; + ttype_model = *optarg; + break; + default: errflg++; /* unknown */ + break; + } + break; + default: + errflg++; /* unknown */ + break; + } + } + if (errflg) { + (void) fprintf(stderr,"%s\n",usage); + exit(2); + } if (argc <= 1) { ! (void) fprintf (stderr, "%s\n", usage); exit (1); } ! screen_buf = (u_char *) malloc(ROWSCOLS); ! prim_seln = (u_char *) malloc(ROWSCOLS + ROWS + 1); ! shelf_seln = (u_char *) malloc(ROWSCOLS + ROWS + 1); ! net_sock = connect_net (argv[optind]); ! /* ! * end of changes ! */ screen_init (); key_panel_init (); menu_init (); *** Makefile Thu Aug 2 12:51:33 1990 --- ../Makefile Thu Aug 2 12:53:49 1990 *************** *** 11,17 **** # BINDIR destination of the binary # MANDIR destination of the manual page # MANEXT the . extension of the installed manual page ! # CFLAGS add -DTYPE4KBD if you have a Type 4 kybd # FONTDIR = /usr/local/lib/fonts BINDIR = /usr/local/bin --- 11,19 ---- # BINDIR destination of the binary # MANDIR destination of the manual page # MANEXT the . extension of the installed manual page ! # CFLAGS C flags ! # KBDFLGS change to -DTYPE4KBD ! # FNTFLGS Font directory define # FONTDIR = /usr/local/lib/fonts BINDIR = /usr/local/bin *************** *** 18,27 **** MANDIR = /usr/man/manl MANEXT = l CC = cc ! CFLAGS = -O2 -DFONT3270=\"$(FONTDIR)/3270.font\" 3270tool: 3270tool.o screen.o telnet.o kybd.o keypanel.o selection.o ! $(CC) $(CFLAGS) -o 3270tool 3270tool.o screen.o telnet.o kybd.o keypanel.o selection.o -lsunwindow -lsuntool -lpixrect install: $(BINDIR)/3270tool $(MANDIR)/3270tool.$(MANEXT) $(FONTDIR)/3270.font --- 20,34 ---- MANDIR = /usr/man/manl MANEXT = l CC = cc ! CFLAGS = -O2 ! LIBS = -lsunwindow -lsuntool -lpixrect ! FNTFLGS = -DFONT3270=\"$(FONTDIR)/3270.font\" ! KBDFLGS = -DTYPE3KBD ! #KBDFLGS = -DDEBUG ! ####KBDFLGS = -DTYPE4KBD -DTYPE3KBD 3270tool: 3270tool.o screen.o telnet.o kybd.o keypanel.o selection.o ! $(CC) $(CFLAGS) -o 3270tool 3270tool.o screen.o telnet.o kybd.o keypanel.o selection.o $(LIBS) install: $(BINDIR)/3270tool $(MANDIR)/3270tool.$(MANEXT) $(FONTDIR)/3270.font *************** *** 56,58 **** --- 63,76 ---- selection.o: selection.c 3270.h 3270_enc.h $(CC) $(CFLAGS) -c selection.c + + SRC=3270tool.c telnet.c keypanel.c selection.c + OBJ=3270tool.o telnet.o keypanel.o selection.o screen.o kybd.o + + saber_src: + #load -g $(CFLAGS) $(SRC) $(LIBS) + #load -g -DFONT3270=\\"$(FONTDIR)/3270.font\\" screen.c + #load -g -DTYPE3KBD -DDEBUG kybd.c + + saber_obj: + #load -g $(OBJ) $(LIBS) *** kybd.c Thu Jul 26 13:30:39 1990 --- ../kybd.c Wed Aug 1 12:09:06 1990 *************** *** 102,108 **** u_char aid = AID_NO; /* current attention ID */ Menu Key_menu; ! extern u_char screen_buf[ROWS * COLS]; extern int cursor_addr, buffer_addr; extern Pixwin *pixwin; extern Canvas canvas; --- 102,109 ---- u_char aid = AID_NO; /* current attention ID */ Menu Key_menu; ! /*extern u_char screen_buf[ROWS * COLS];*/ ! extern u_char *screen_buf; extern int cursor_addr, buffer_addr; extern Pixwin *pixwin; extern Canvas canvas; *************** *** 242,249 **** bcopy ((char *) &screen_buf[baddr], (char *) &screen_buf[baddr+1], end_baddr - baddr); else { bcopy ((char *) &screen_buf[0], (char *) &screen_buf[1], end_baddr); ! screen_buf[0] = screen_buf[(ROWS * COLS) - 1]; ! bcopy ((char *) &screen_buf[baddr], (char *) &screen_buf[baddr+1], ((ROWS * COLS) - 1) - baddr); } screen_buf[baddr] = cgcode; cursor_off (); --- 243,250 ---- bcopy ((char *) &screen_buf[baddr], (char *) &screen_buf[baddr+1], end_baddr - baddr); else { bcopy ((char *) &screen_buf[0], (char *) &screen_buf[1], end_baddr); ! screen_buf[0] = screen_buf[(ROWSCOLS) - 1]; ! bcopy ((char *) &screen_buf[baddr], (char *) &screen_buf[baddr+1], ((ROWSCOLS) - 1) - baddr); } screen_buf[baddr] = cgcode; cursor_off (); *************** *** 496,502 **** return; baddr = cursor_addr - COLS; if (baddr < 0) ! baddr = (cursor_addr + (ROWS * COLS)) - COLS; cursor_move (baddr); } --- 497,503 ---- return; baddr = cursor_addr - COLS; if (baddr < 0) ! baddr = (cursor_addr + (ROWSCOLS)) - COLS; cursor_move (baddr); } *************** *** 510,516 **** if (kybdlock) return; ! baddr = (cursor_addr + COLS) % (COLS * ROWS); cursor_move (baddr); } --- 511,517 ---- if (kybdlock) return; ! baddr = (cursor_addr + COLS) % (ROWSCOLS); cursor_move (baddr); } *************** *** 525,531 **** if (kybdlock) return; ! baddr = (cursor_addr + COLS) % (COLS * ROWS); /* down */ baddr = (baddr / COLS) * COLS; /* 1st col */ fa = get_field_attribute (baddr); if (fa != (&screen_buf[baddr]) && !FA_IS_PROTECTED (*fa)) --- 526,532 ---- if (kybdlock) return; ! baddr = (cursor_addr + COLS) % (ROWSCOLS); /* down */ baddr = (baddr / COLS) * COLS; /* 1st col */ fa = get_field_attribute (baddr); if (fa != (&screen_buf[baddr]) && !FA_IS_PROTECTED (*fa)) *************** *** 1112,1119 **** if (end_baddr > baddr) bcopy ((char *) &screen_buf[baddr+1], (char *) &screen_buf[baddr], end_baddr - baddr); else { ! bcopy ((char *) &screen_buf[baddr+1], (char *) &screen_buf[baddr], ((ROWS * COLS) - 1) - baddr); ! screen_buf[(ROWS * COLS) - 1] = screen_buf[0]; bcopy ((char *) &screen_buf[1], (char *) &screen_buf[0], end_baddr); } screen_buf[end_baddr] = CG_NULLBLANK; --- 1113,1120 ---- if (end_baddr > baddr) bcopy ((char *) &screen_buf[baddr+1], (char *) &screen_buf[baddr], end_baddr - baddr); else { ! bcopy ((char *) &screen_buf[baddr+1], (char *) &screen_buf[baddr], ((ROWSCOLS) - 1) - baddr); ! screen_buf[(ROWSCOLS) - 1] = screen_buf[0]; bcopy ((char *) &screen_buf[1], (char *) &screen_buf[0], end_baddr); } screen_buf[end_baddr] = CG_NULLBLANK; *************** *** 1329,1335 **** return (NOTIFY_IGNORED); baddr = ROWCOL_TO_BA(Y_TO_ROW (event_y (event)), X_TO_COL (event_x (event))); ! while (baddr >= (COLS * ROWS)) baddr -= COLS; cursor_move (baddr); break; --- 1330,1336 ---- return (NOTIFY_IGNORED); baddr = ROWCOL_TO_BA(Y_TO_ROW (event_y (event)), X_TO_COL (event_x (event))); ! while (baddr >= (ROWSCOLS)) baddr -= COLS; cursor_move (baddr); break; *************** *** 1336,1342 **** case MS_MIDDLE: /* middle mouse sets selections */ baddr = ROWCOL_TO_BA(Y_TO_ROW (event_y (event)), X_TO_COL (event_x (event))); ! while (baddr >= (COLS * ROWS)) baddr -= COLS; set_seln (cursor_addr, baddr); break; --- 1337,1343 ---- case MS_MIDDLE: /* middle mouse sets selections */ baddr = ROWCOL_TO_BA(Y_TO_ROW (event_y (event)), X_TO_COL (event_x (event))); ! while (baddr >= (ROWSCOLS)) baddr -= COLS; set_seln (cursor_addr, baddr); break; *** screen.c Thu Jul 26 13:30:39 1990 --- ../screen.c Wed Aug 1 14:27:07 1990 *************** *** 158,164 **** /* the following are set from values in the 3270 font */ int char_width, char_height, char_base; ! u_char screen_buf[ROWS * COLS]; bool formatted = FALSE; /* set in screen_disp */ struct itimerval blink_timer; --- 158,165 ---- /* the following are set from values in the 3270 font */ int char_width, char_height, char_base; ! /* u_char screen_buf[ROWS * COLS]; */ ! extern u_char *screen_buf; bool formatted = FALSE; /* set in screen_disp */ struct itimerval blink_timer; *************** *** 220,226 **** COL_TO_X (COLS), ROW_TO_Y (ROWS) + 2, PIX_SET, 1 ); ! bzero ((char *) screen_buf, sizeof (screen_buf)); cursor_addr = 0; buffer_addr = 0; pw_batch_on (pixwin); --- 221,227 ---- COL_TO_X (COLS), ROW_TO_Y (ROWS) + 2, PIX_SET, 1 ); ! bzero ((char *) screen_buf, ROWSCOLS); cursor_addr = 0; buffer_addr = 0; pw_batch_on (pixwin); *************** *** 643,649 **** case CMD_EWA: /* erase/write alternate */ /* on 3278-2, same as erase/write. fallthrough */ case CMD_EW: /* erase/write */ ! bzero ((char *) screen_buf, sizeof (screen_buf)); buffer_addr = 0; cursor_off (); pw_writebackground (pixwin, 0, 0, COL_TO_X (COLS), ROW_TO_Y (ROWS), PIX_CLR); --- 644,650 ---- case CMD_EWA: /* erase/write alternate */ /* on 3278-2, same as erase/write. fallthrough */ case CMD_EW: /* erase/write */ ! bzero ((char *) screen_buf, ROWSCOLS); buffer_addr = 0; cursor_off (); pw_writebackground (pixwin, 0, 0, COL_TO_X (COLS), ROW_TO_Y (ROWS), PIX_CLR); *************** *** 812,818 **** cursor_move (0); } else { ! bzero ((char *) screen_buf, sizeof (screen_buf)); pw_writebackground (pixwin, 0, 0, COL_TO_X (COLS), ROW_TO_Y (ROWS), PIX_CLR); buffer_addr = 0; cursor_move (0); --- 813,819 ---- cursor_move (0); } else { ! bzero ((char *) screen_buf, ROWSCOLS); pw_writebackground (pixwin, 0, 0, COL_TO_X (COLS), ROW_TO_Y (ROWS), PIX_CLR); buffer_addr = 0; cursor_move (0); *************** *** 885,891 **** buffer_addr = ((*(cp-1) & 0x3F) << 8) | *cp; else /* 12-bit coded */ buffer_addr = ((*(cp-1) & 0x3F) << 6) | (*cp & 0x3F); ! buffer_addr %= (COLS * ROWS); current_fa = get_field_attribute (buffer_addr); last_cmd = TRUE; break; --- 886,892 ---- buffer_addr = ((*(cp-1) & 0x3F) << 8) | *cp; else /* 12-bit coded */ buffer_addr = ((*(cp-1) & 0x3F) << 6) | (*cp & 0x3F); ! buffer_addr %= (ROWSCOLS); current_fa = get_field_attribute (buffer_addr); last_cmd = TRUE; break; *************** *** 927,933 **** baddr = ((*(cp-1) & 0x3F) << 8) | *cp; else /* 12-bit coded */ baddr = ((*(cp-1) & 0x3F) << 6) | (*cp & 0x3F); ! baddr %= (COLS * ROWS); cp++; /* skip char to repeat */ if (*cp == ORDER_GE) cp++; --- 928,934 ---- baddr = ((*(cp-1) & 0x3F) << 8) | *cp; else /* 12-bit coded */ baddr = ((*(cp-1) & 0x3F) << 6) | (*cp & 0x3F); ! baddr %= (ROWSCOLS); cp++; /* skip char to repeat */ if (*cp == ORDER_GE) cp++; *************** *** 950,956 **** baddr = ((*(cp-1) & 0x3F) << 8) | *cp; else /* 12-bit coded */ baddr = ((*(cp-1) & 0x3F) << 6) | (*cp & 0x3F); ! baddr %= (COLS * ROWS); do { if (IS_FA (screen_buf[buffer_addr])) current_fa = &(screen_buf[buffer_addr]); --- 951,957 ---- baddr = ((*(cp-1) & 0x3F) << 8) | *cp; else /* 12-bit coded */ baddr = ((*(cp-1) & 0x3F) << 6) | (*cp & 0x3F); ! baddr %= (ROWSCOLS); do { if (IS_FA (screen_buf[buffer_addr])) current_fa = &(screen_buf[buffer_addr]); *** selection.c Thu Jul 26 13:30:39 1990 --- ../selection.c Wed Aug 1 12:09:07 1990 *************** *** 23,34 **** bool seln_isset; int row_start, row_end, col_start, col_end; /* selection area */ Seln_client s_client; ! u_char prim_seln[ROWS * COLS + ROWS + 1];/* enough for screen + eols */ int prim_size = 0; ! u_char shelf_seln[ROWS * COLS + ROWS + 1]; int shelf_size = 0; extern u_char asc2cg[128], cg2asc[256]; ! extern u_char screen_buf[ROWS * COLS]; extern Pixwin *pixwin; extern Pixfont *ibmfont; extern int char_width, char_height, char_base; --- 23,35 ---- bool seln_isset; int row_start, row_end, col_start, col_end; /* selection area */ Seln_client s_client; ! /* u_char prim_seln[ROWS * COLS + ROWS + 1];/* enough for screen + eols */ int prim_size = 0; ! /* u_char shelf_seln[ROWS * COLS + ROWS + 1]; */ int shelf_size = 0; extern u_char asc2cg[128], cg2asc[256]; ! /* extern u_char screen_buf[ROWS * COLS]; */ ! extern u_char *screen_buf, *prim_seln, *shelf_seln; extern Pixwin *pixwin; extern Pixfont *ibmfont; extern int char_width, char_height, char_base; *** telnet.c Thu Jul 26 13:30:39 1990 --- ../telnet.c Wed Aug 1 13:58:29 1990 *************** *** 49,54 **** --- 49,55 ---- static u_char ttype_opt[] = { IAC, SB, TELOPT_TTYPE, TELQUAL_IS, 'I', 'B', 'M', '-', '3', '2', '7', '8', '-', '2', IAC, SE }; + extern u_char ttype_model; extern Frame frame; extern u_long inet_addr (); *************** *** 259,264 **** --- 260,266 ---- if (*cp == SE) { telnet_state = TNS_DATA; if (sbbuf[0] == TELOPT_TTYPE && sbbuf[1] == TELQUAL_SEND) { + ttype_opt[13] = ttype_model; (void) write (fd, (char *) ttype_opt, sizeof (ttype_opt)); } }