1 /* exp_win.c - window support
2 
3 Written by: Don Libes, NIST, 10/25/93
4 
5 This file is in the public domain.  However, the author and NIST
6 would 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  *
26 note that this is tricky because (of course) everyone puts them in
27 different places.  Worse, on some systems, some .h files conflict
28 and cannot both be included even though both exist.  This is the
29 case, for example, on SunOS 4.1.3 using gcc where termios.h
30 conflicts 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
58 typedef 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)
65 typedef 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)
72 typedef struct {
73 	int columns;
74 	int rows;
75 } exp_winsize;
76 #endif
77 
78 static exp_winsize winsize = {0, 0};
79 static exp_winsize win2size = {0, 0};
80 
exp_window_size_set(fd)81 int exp_window_size_set(fd)
82 int 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 
exp_window_size_get(fd)92 int exp_window_size_get(fd)
93 int 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 
107 void
exp_win_rows_set(rows)108 exp_win_rows_set(rows)
109 char *rows;
110 {
111 	winsize.rows = atoi(rows);
112 	exp_window_size_set(exp_dev_tty);
113 }
114 
115 char*
exp_win_rows_get()116 exp_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 
124 void
exp_win_columns_set(columns)125 exp_win_columns_set(columns)
126 char *columns;
127 {
128 	winsize.columns = atoi(columns);
129 	exp_window_size_set(exp_dev_tty);
130 }
131 
132 char*
exp_win_columns_get()133 exp_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 
exp_win2_size_set(fd)145 int exp_win2_size_set(fd)
146 int 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 
exp_win2_size_get(fd)156 int exp_win2_size_get(fd)
157 int 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 
167 void
exp_win2_rows_set(fd,rows)168 exp_win2_rows_set(fd,rows)
169 int fd;
170 char *rows;
171 {
172 	exp_win2_size_get(fd);
173 	win2size.rows = atoi(rows);
174 	exp_win2_size_set(fd);
175 }
176 
177 char*
exp_win2_rows_get(fd)178 exp_win2_rows_get(fd)
179 int 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 
191 void
exp_win2_columns_set(fd,columns)192 exp_win2_columns_set(fd,columns)
193 int fd;
194 char *columns;
195 {
196 	exp_win2_size_get(fd);
197 	win2size.columns = atoi(columns);
198 	exp_win2_size_set(fd);
199 }
200 
201 char*
exp_win2_columns_get(fd)202 exp_win2_columns_get(fd)
203 int 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