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