1/* exp_win.c - window support 2 3Written by: Don Libes, NIST, 10/25/93 4 5This file is in the public domain. However, the author and NIST 6would appreciate credit if you use this file or parts of it. 7 8*/ 9 10#include "expect_cf.h" 11#include "tcl.h" 12 13#ifdef NO_STDLIB_H 14#include "../compat/stdlib.h" 15#else 16#include <stdlib.h> 17#endif 18 19/* _IBCS2 required on some Intel platforms to allow the include files */ 20/* to produce a definition for winsize. */ 21#define _IBCS2 1 22 23/* 24 * get everyone's window size definitions 25 * 26note that this is tricky because (of course) everyone puts them in 27different places. Worse, on some systems, some .h files conflict 28and cannot both be included even though both exist. This is the 29case, for example, on SunOS 4.1.3 using gcc where termios.h 30conflicts with sys/ioctl.h 31 */ 32 33#ifdef HAVE_TERMIOS 34# include <termios.h> 35#else 36# include <sys/ioctl.h> 37#endif 38 39/* Sigh. On AIX 2.3, termios.h exists but does not define TIOCGWINSZ */ 40/* Instead, it has to come from ioctl.h. However, As I said above, this */ 41/* can't be cavalierly included on all machines, even when it exists. */ 42#if defined(HAVE_TERMIOS) && !defined(HAVE_TIOCGWINSZ_IN_TERMIOS_H) 43# include <sys/ioctl.h> 44#endif 45 46/* SCO defines window size structure in PTEM and TIOCGWINSZ in termio.h */ 47/* Sigh... */ 48#if defined(HAVE_SYS_PTEM_H) 49# include <sys/types.h> /* for stream.h's caddr_t */ 50# include <sys/stream.h> /* for ptem.h's mblk_t */ 51# include <sys/ptem.h> 52#endif /* HAVE_SYS_PTEM_H */ 53 54#include "exp_tty_in.h" 55#include "exp_win.h" 56 57#ifdef TIOCGWINSZ 58typedef struct winsize exp_winsize; 59#define columns ws_col 60#define rows ws_row 61#define EXP_WIN 62#endif 63 64#if !defined(EXP_WIN) && defined(TIOCGSIZE) 65typedef struct ttysize exp_winsize; 66#define columns ts_cols 67#define rows ts_lines 68#define EXP_WIN 69#endif 70 71#if !defined(EXP_WIN) 72typedef struct { 73 int columns; 74 int rows; 75} exp_winsize; 76#endif 77 78static exp_winsize winsize = {0, 0}; 79static exp_winsize win2size = {0, 0}; 80 81int exp_window_size_set(fd) 82int fd; 83{ 84#ifdef TIOCSWINSZ 85 ioctl(fd,TIOCSWINSZ,&winsize); 86#endif 87#if defined(TIOCSSIZE) && !defined(TIOCSWINSZ) 88 ioctl(fd,TIOCSSIZE,&winsize); 89#endif 90} 91 92int exp_window_size_get(fd) 93int fd; 94{ 95#ifdef TIOCGWINSZ 96 ioctl(fd,TIOCGWINSZ,&winsize); 97#endif 98#if defined(TIOCGSIZE) && !defined(TIOCGWINSZ) 99 ioctl(fd,TIOCGSIZE,&winsize); 100#endif 101#if !defined(EXP_WIN) 102 winsize.rows = 0; 103 winsize.columns = 0; 104#endif 105} 106 107void 108exp_win_rows_set(rows) 109char *rows; 110{ 111 winsize.rows = atoi(rows); 112 exp_window_size_set(exp_dev_tty); 113} 114 115char* 116exp_win_rows_get() 117{ 118 static char rows [20]; 119 exp_window_size_get(exp_dev_tty); 120 sprintf(rows,"%d",winsize.rows); 121 return rows; 122} 123 124void 125exp_win_columns_set(columns) 126char *columns; 127{ 128 winsize.columns = atoi(columns); 129 exp_window_size_set(exp_dev_tty); 130} 131 132char* 133exp_win_columns_get() 134{ 135 static char columns [20]; 136 exp_window_size_get(exp_dev_tty); 137 sprintf(columns,"%d",winsize.columns); 138 return columns; 139} 140 141/* 142 * separate copy of everything above - used for handling user stty requests 143 */ 144 145int exp_win2_size_set(fd) 146int fd; 147{ 148#ifdef TIOCSWINSZ 149 ioctl(fd,TIOCSWINSZ,&win2size); 150#endif 151#if defined(TIOCSSIZE) && !defined(TIOCSWINSZ) 152 ioctl(fd,TIOCSSIZE,&win2size); 153#endif 154} 155 156int exp_win2_size_get(fd) 157int fd; 158{ 159#ifdef TIOCGWINSZ 160 ioctl(fd,TIOCGWINSZ,&win2size); 161#endif 162#if defined(TIOCGSIZE) && !defined(TIOCGWINSZ) 163 ioctl(fd,TIOCGSIZE,&win2size); 164#endif 165} 166 167void 168exp_win2_rows_set(fd,rows) 169int fd; 170char *rows; 171{ 172 exp_win2_size_get(fd); 173 win2size.rows = atoi(rows); 174 exp_win2_size_set(fd); 175} 176 177char* 178exp_win2_rows_get(fd) 179int fd; 180{ 181 static char rows [20]; 182 exp_win2_size_get(fd); 183 sprintf(rows,"%d",win2size.rows); 184#if !defined(EXP_WIN) 185 win2size.rows = 0; 186 win2size.columns = 0; 187#endif 188 return rows; 189} 190 191void 192exp_win2_columns_set(fd,columns) 193int fd; 194char *columns; 195{ 196 exp_win2_size_get(fd); 197 win2size.columns = atoi(columns); 198 exp_win2_size_set(fd); 199} 200 201char* 202exp_win2_columns_get(fd) 203int fd; 204{ 205 static char columns [20]; 206 exp_win2_size_get(fd); 207 sprintf(columns,"%d",win2size.columns); 208 return columns; 209} 210 211/* 212 * Local Variables: 213 * mode: c 214 * c-basic-offset: 4 215 * fill-column: 78 216 * End: 217 */ 218