Add GNU LGPL headers to all .c .C and .h files
[oweals/cde.git] / cde / programs / dtksh / ksh93 / src / lib / libast / port / getwinsize.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 librararies 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: getwinsize.c /main/3 1995/11/01 18:20:07 rswiston $ */
24 /***************************************************************
25 *                                                              *
26 *                      AT&T - PROPRIETARY                      *
27 *                                                              *
28 *        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF        *
29 *                    AT&T BELL LABORATORIES                    *
30 *         AND IS NOT TO BE DISCLOSED OR USED EXCEPT IN         *
31 *            ACCORDANCE WITH APPLICABLE AGREEMENTS             *
32 *                                                              *
33 *          Copyright (c) 1994 AT&T Bell Laboratories           *
34 *              Unpublished & Not for Publication               *
35 *                     All Rights Reserved                      *
36 *                                                              *
37 *       The copyright notice above does not evidence any       *
38 *      actual or intended publication of such source code      *
39 *                                                              *
40 *               This software was created by the               *
41 *           Software Engineering Research Department           *
42 *                    AT&T Bell Laboratories                    *
43 *                                                              *
44 *               For further information contact                *
45 *                   advsoft@research.att.com                   *
46 *                 Randy Hackbarth 908-582-5245                 *
47 *                  Dave Belanger 908-582-7427                  *
48 *                                                              *
49 ***************************************************************/
50
51 /* : : generated by proto : : */
52
53 #line 1
54
55 #if !defined(__PROTO__)
56 #if defined(__STDC__) || defined(__cplusplus) || defined(_proto) || defined(c_plusplus)
57 #if defined(__cplusplus)
58 #define __MANGLE__      "C"
59 #else
60 #define __MANGLE__
61 #endif
62 #define __STDARG__
63 #define __PROTO__(x)    x
64 #define __OTORP__(x)
65 #define __PARAM__(n,o)  n
66 #if !defined(__STDC__) && !defined(__cplusplus)
67 #if !defined(c_plusplus)
68 #define const
69 #endif
70 #define signed
71 #define void            int
72 #define volatile
73 #define __V_            char
74 #else
75 #define __V_            void
76 #endif
77 #else
78 #define __PROTO__(x)    ()
79 #define __OTORP__(x)    x
80 #define __PARAM__(n,o)  o
81 #define __MANGLE__
82 #define __V_            char
83 #define const
84 #define signed
85 #define void            int
86 #define volatile
87 #endif
88 #if defined(__cplusplus) || defined(c_plusplus)
89 #define __VARARG__      ...
90 #else
91 #define __VARARG__
92 #endif
93 #if defined(__STDARG__)
94 #define __VA_START__(p,a)       va_start(p,a)
95 #else
96 #define __VA_START__(p,a)       va_start(p)
97 #endif
98 #endif
99
100 #line 8
101 #include <ast.h>
102 #include <ast_tty.h>
103
104 #if defined(__STDPP__directive) && defined(__STDPP__hide)
105 __STDPP__directive pragma pp:hide ioctl sleep
106 #else
107 #define ioctl           ______ioctl
108 #define sleep           ______sleep
109 #endif
110
111 #if defined(TIOCGWINSZ)
112 #if _sys_stream && _sys_ptem
113 #include <sys/stream.h>
114 #include <sys/ptem.h>
115 #endif
116 #else
117 #if !defined(TIOCGSIZE) && !defined(TIOCGWINSZ)
118 #ifdef _hdr_jioctl
119 #define jwinsize        winsize
120 #include <jioctl.h>
121 #else
122 #ifdef _sys_jioctl
123 #define jwinsize        winsize
124 #include <sys/jioctl.h>
125 #endif
126 #endif
127 #endif
128 #endif
129
130 #if defined(__STDPP__directive) && defined(__STDPP__hide)
131 __STDPP__directive pragma pp:nohide ioctl sleep
132 #else
133 #undef  ioctl
134 #undef  sleep
135 #endif
136
137 static int              ttctl __PROTO__((int, int, __V_*));
138
139 void
140 getwinsize __PARAM__((int fd, register int* rows, register int* cols), (fd, rows, cols)) __OTORP__(int fd; register int* rows; register int* cols;)
141 #line 48
142 {
143 #ifdef  TIOCGSIZE
144 #define NEED_ttctl
145         struct ttysize  ts;
146
147         if (!ttctl(fd, TIOCGSIZE, &ts) && ts.ts_lines > 0 && ts.ts_cols > 0)
148         {
149                 if (rows) *rows = ts.ts_lines;
150                 if (cols) *cols = ts.ts_cols;
151         }
152         else
153 #else
154 #ifdef  TIOCGWINSZ
155 #define NEED_ttctl
156         struct winsize  ws;
157
158         if (!ttctl(fd, TIOCGWINSZ, &ws) && ws.ws_col > 0 && ws.ws_row > 0)
159         {
160                 if (rows) *rows = ws.ws_row;
161                 if (cols) *cols = ws.ws_col;
162         }
163         else
164 #else
165 #ifdef  JWINSIZE
166 #define NEED_ttctl
167         struct winsize  ws;
168
169         if (!ttctl(fd, JWINSIZE, &ws) && ws.bytesx > 0 && ws.bytesy > 0)
170         {
171                 if (rows) *rows = ws.bytesy;
172                 if (cols) *cols = ws.bytesx;
173         }
174         else
175 #endif
176 #endif
177 #endif
178         {
179                 char*           s;
180
181                 if (rows) *rows = (s = getenv("LINES")) ? strtol(s, NiL, 0) : 0;
182                 if (cols) *cols = (s = getenv("COLUMNS")) ? strtol(s, NiL, 0) : 0;
183         }
184 }
185
186 #ifdef  NEED_ttctl
187
188 /*
189  * tty ioctl() -- no cache
190  */
191
192 static int
193 ttctl __PARAM__((register int fd, int op, __V_* tt), (fd, op, tt)) __OTORP__(register int fd; int op; __V_* tt;)
194 #line 100
195 {
196         register int    v;
197
198         if (fd < 0)
199         {
200                 for (fd = 0; fd <= 2; fd++)
201                         if (!ioctl(fd, op, tt)) return(0);
202                 if ((fd = open("/dev/tty", 0)) >= 0)
203                 {
204                         v = ioctl(fd, op, tt);
205                         close(fd);
206                         return(v);
207                 }
208         }
209         else if (!ioctl(fd, op, tt)) return(0);
210         return(-1);
211 }
212
213 #endif