Imported Upstream version 5.45
[platform/upstream/expect.git] / exp_win.c
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
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
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
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*
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
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*
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
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
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
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*
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
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*
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 \f
211 /*
212  * Local Variables:
213  * mode: c
214  * c-basic-offset: 4
215  * fill-column: 78
216  * End:
217  */