bf58fd183d4f9cb577432164a6c4c7cb29f93537
[oweals/cde.git] / cde / programs / dtksh / ksh93 / src / lib / libast / port / astwinsize.c
1 /*
2  * CDE - Common Desktop Environment
3  *
4  * Copyright (c) 1993-2012, The Open Group. All rights reserved.
5  *
6  * These libraries and programs are free software; you can
7  * redistribute them and/or modify them under the terms of the GNU
8  * Lesser General Public License as published by the Free Software
9  * Foundation; either version 2 of the License, or (at your option)
10  * any later version.
11  *
12  * These libraries and programs are distributed in the hope that
13  * they will be useful, but WITHOUT ANY WARRANTY; without even the
14  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15  * PURPOSE. See the GNU Lesser General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with these libraries and programs; if not, write
20  * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21  * Floor, Boston, MA 02110-1301 USA
22  */
23 /* $XConsortium: astwinsize.c /main/2 1996/05/08 19:57:16 drk $ */
24 /***************************************************************
25 *                                                              *
26 *                      AT&T - PROPRIETARY                      *
27 *                                                              *
28 *         THIS IS PROPRIETARY SOURCE CODE LICENSED BY          *
29 *                          AT&T CORP.                          *
30 *                                                              *
31 *                Copyright (c) 1995 AT&T Corp.                 *
32 *                     All Rights Reserved                      *
33 *                                                              *
34 *           This software is licensed by AT&T Corp.            *
35 *       under the terms and conditions of the license in       *
36 *       http://www.research.att.com/orgs/ssr/book/reuse        *
37 *                                                              *
38 *               This software was created by the               *
39 *           Software Engineering Research Department           *
40 *                    AT&T Bell Laboratories                    *
41 *                                                              *
42 *               For further information contact                *
43 *                     gsf@research.att.com                     *
44 *                                                              *
45 ***************************************************************/
46
47 /* : : generated by proto : : */
48
49 #if !defined(__PROTO__)
50 #if defined(__STDC__) || defined(__cplusplus) || defined(_proto) || defined(c_plusplus)
51 #if defined(__cplusplus)
52 #define __MANGLE__      "C"
53 #else
54 #define __MANGLE__
55 #endif
56 #define __STDARG__
57 #define __PROTO__(x)    x
58 #define __OTORP__(x)
59 #define __PARAM__(n,o)  n
60 #if !defined(__STDC__) && !defined(__cplusplus)
61 #if !defined(c_plusplus)
62 #define const
63 #endif
64 #define signed
65 #define void            int
66 #define volatile
67 #define __V_            char
68 #else
69 #define __V_            void
70 #endif
71 #else
72 #define __PROTO__(x)    ()
73 #define __OTORP__(x)    x
74 #define __PARAM__(n,o)  o
75 #define __MANGLE__
76 #define __V_            char
77 #define const
78 #define signed
79 #define void            int
80 #define volatile
81 #endif
82 #if defined(__cplusplus) || defined(c_plusplus)
83 #define __VARARG__      ...
84 #else
85 #define __VARARG__
86 #endif
87 #if defined(__STDARG__)
88 #define __VA_START__(p,a)       va_start(p,a)
89 #else
90 #define __VA_START__(p,a)       va_start(p)
91 #endif
92 #endif
93 #include <ast.h>
94 #include <ast_tty.h>
95
96 #if defined(__STDPP__directive) && defined(__STDPP__hide)
97 __STDPP__directive pragma pp:hide ioctl sleep
98 #else
99 #define ioctl           ______ioctl
100 #define sleep           ______sleep
101 #endif
102
103 #if defined(TIOCGWINSZ)
104 #if _sys_stream && _sys_ptem
105 #include <sys/stream.h>
106 #include <sys/ptem.h>
107 #endif
108 #else
109 #if !defined(TIOCGSIZE) && !defined(TIOCGWINSZ)
110 #ifdef _hdr_jioctl
111 #define jwinsize        winsize
112 #include <jioctl.h>
113 #else
114 #ifdef _sys_jioctl
115 #define jwinsize        winsize
116 #include <sys/jioctl.h>
117 #endif
118 #endif
119 #endif
120 #endif
121
122 #if defined(__STDPP__directive) && defined(__STDPP__hide)
123 __STDPP__directive pragma pp:nohide ioctl sleep
124 #else
125 #undef  ioctl
126 #undef  sleep
127 #endif
128
129 static int              ttctl __PROTO__((int, int, __V_*));
130
131 void
132 astwinsize __PARAM__((int fd, register int* rows, register int* cols), (fd, rows, cols)) __OTORP__(int fd; register int* rows; register int* cols;){
133 #ifdef  TIOCGWINSZ
134 #define NEED_ttctl
135         struct winsize  ws;
136
137         if (!ttctl(fd, TIOCGWINSZ, &ws) && ws.ws_col > 0 && ws.ws_row > 0)
138         {
139                 if (rows) *rows = ws.ws_row;
140                 if (cols) *cols = ws.ws_col;
141         }
142         else
143 #else
144 #ifdef  TIOCGSIZE
145 #define NEED_ttctl
146         struct ttysize  ts;
147
148         if (!ttctl(fd, TIOCGSIZE, &ts) && ts.ts_lines > 0 && ts.ts_cols > 0)
149         {
150                 if (rows) *rows = ts.ts_lines;
151                 if (cols) *cols = ts.ts_cols;
152         }
153         else
154 #else
155 #ifdef  JWINSIZE
156 #define NEED_ttctl
157         struct winsize  ws;
158
159         if (!ttctl(fd, JWINSIZE, &ws) && ws.bytesx > 0 && ws.bytesy > 0)
160         {
161                 if (rows) *rows = ws.bytesy;
162                 if (cols) *cols = ws.bytesx;
163         }
164         else
165 #endif
166 #endif
167 #endif
168         {
169                 char*           s;
170
171                 if (rows) *rows = (s = getenv("LINES")) ? strtol(s, NiL, 0) : 0;
172                 if (cols) *cols = (s = getenv("COLUMNS")) ? strtol(s, NiL, 0) : 0;
173         }
174 }
175
176 #ifdef  NEED_ttctl
177
178 /*
179  * tty ioctl() -- no cache
180  */
181
182 static int
183 ttctl __PARAM__((register int fd, int op, __V_* tt), (fd, op, tt)) __OTORP__(register int fd; int op; __V_* tt;){
184         register int    v;
185
186         if (fd < 0)
187         {
188                 for (fd = 0; fd <= 2; fd++)
189                         if (!ioctl(fd, op, tt)) return(0);
190                 if ((fd = open("/dev/tty", 0)) >= 0)
191                 {
192                         v = ioctl(fd, op, tt);
193                         close(fd);
194                         return(v);
195                 }
196         }
197         else if (!ioctl(fd, op, tt)) return(0);
198         return(-1);
199 }
200
201 #endif