]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.bin/tset/tset.c
Add a TestFloat based test suite for floating-point implementations
[FreeBSD/FreeBSD.git] / usr.bin / tset / tset.c
1 /*-
2  * Copyright (c) 1980, 1991, 1993
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by the University of
16  *      California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33
34 #include <sys/cdefs.h>
35
36 __FBSDID("$FreeBSD$");
37
38 #ifndef lint
39 static const char copyright[] =
40 "@(#) Copyright (c) 1980, 1991, 1993\n\
41         The Regents of the University of California.  All rights reserved.\n";
42 #endif
43
44 #ifndef lint
45 static const char sccsid[] = "@(#)tset.c        8.1 (Berkeley) 6/9/93";
46 #endif
47
48 #include <sys/types.h>
49 #include <sys/ioctl.h>
50
51 #include <ctype.h>
52 #include <err.h>
53 #include <stdio.h>
54 #include <stdlib.h>
55 #include <string.h>
56 #include <termcap.h>
57 #include <termios.h>
58 #include <unistd.h>
59
60 #include "extern.h"
61
62 void    obsolete(char *[]);
63 void    report(const char *, int, u_int);
64 void    usage(void);
65
66 struct termios mode, oldmode;
67
68 int     erasech;                /* new erase character */
69 int     intrchar;               /* new interrupt character */
70 int     isreset;                /* invoked as reset */
71 int     killch;                 /* new kill character */
72 int     Lines, Columns;         /* window size */
73 speed_t Ospeed;
74
75 int
76 main(int argc, char *argv[])
77 {
78 #ifdef TIOCGWINSZ
79         struct winsize win;
80 #endif
81         int ch, noinit, noset, quiet, Sflag, sflag, showterm, usingupper;
82         char *p, *tcapbuf;
83         const char *ttype;
84
85         if (tcgetattr(STDERR_FILENO, &mode) < 0)
86                 err(1, "standard error");
87
88         oldmode = mode;
89         Ospeed = cfgetospeed(&mode);
90
91         if ((p = strrchr(*argv, '/')))
92                 ++p;
93         else
94                 p = *argv;
95         usingupper = isupper(*p);
96         if (!strcasecmp(p, "reset")) {
97                 isreset = 1;
98                 reset_mode();
99         }
100
101         obsolete(argv);
102         noinit = noset = quiet = Sflag = sflag = showterm = 0;
103         while ((ch = getopt(argc, argv, "-a:d:e:Ii:k:m:np:QSrs")) != -1) {
104                 switch (ch) {
105                 case '-':               /* display term only */
106                         noset = 1;
107                         break;
108                 case 'a':               /* OBSOLETE: map identifier to type */
109                         add_mapping("arpanet", optarg);
110                         break;
111                 case 'd':               /* OBSOLETE: map identifier to type */
112                         add_mapping("dialup", optarg);
113                         break;
114                 case 'e':               /* erase character */
115                         erasech = optarg[0] == '^' && optarg[1] != '\0' ?
116                             optarg[1] == '?' ? '\177' : CTRL(optarg[1]) :
117                             optarg[0];
118                         break;
119                 case 'I':               /* no initialization strings */
120                         noinit = 1;
121                         break;
122                 case 'i':               /* interrupt character */
123                         intrchar = optarg[0] == '^' && optarg[1] != '\0' ?
124                             optarg[1] == '?' ? '\177' : CTRL(optarg[1]) :
125                             optarg[0];
126                         break;
127                 case 'k':               /* kill character */
128                         killch = optarg[0] == '^' && optarg[1] != '\0' ?
129                             optarg[1] == '?' ? '\177' : CTRL(optarg[1]) :
130                             optarg[0];
131                         break;
132                 case 'm':               /* map identifier to type */
133                         add_mapping(NULL, optarg);
134                         break;
135                 case 'n':               /* OBSOLETE: set new tty driver */
136                         break;
137                 case 'p':               /* OBSOLETE: map identifier to type */
138                         add_mapping("plugboard", optarg);
139                         break;
140                 case 'Q':               /* don't output control key settings */
141                         quiet = 1;
142                         break;
143                 case 'S':               /* output TERM/TERMCAP strings */
144                         Sflag = 1;
145                         break;
146                 case 'r':               /* display term on stderr */
147                         showterm = 1;
148                         break;
149                 case 's':               /* output TERM/TERMCAP strings */
150                         sflag = 1;
151                         break;
152                 case '?':
153                 default:
154                         usage();
155                 }
156         }
157         argc -= optind;
158         argv += optind;
159
160         if (argc > 1)
161                 usage();
162
163         ttype = get_termcap_entry(*argv, &tcapbuf);
164
165         if (!noset) {
166                 Columns = tgetnum("co");
167                 Lines = tgetnum("li");
168
169 #ifdef TIOCGWINSZ
170                 /* Set window size */
171                 (void)ioctl(STDERR_FILENO, TIOCGWINSZ, &win);
172                 if (win.ws_row == 0 && win.ws_col == 0 &&
173                     Lines > 0 && Columns > 0) {
174                         win.ws_row = Lines;
175                         win.ws_col = Columns;
176                         (void)ioctl(STDERR_FILENO, TIOCSWINSZ, &win);
177                 }
178 #endif
179                 set_control_chars();
180                 set_conversions(usingupper);
181
182                 if (!noinit)
183                         set_init();
184
185                 /* Set the modes if they've changed. */
186                 if (memcmp(&mode, &oldmode, sizeof(mode)))
187                         tcsetattr(STDERR_FILENO, TCSADRAIN, &mode);
188         }
189
190         if (noset)
191                 (void)printf("%s\n", ttype);
192         else {
193                 if (showterm)
194                         (void)fprintf(stderr, "Terminal type is %s.\n", ttype);
195                 /*
196                  * If erase, kill and interrupt characters could have been
197                  * modified and not -Q, display the changes.
198                  */
199                 if (!quiet) {
200                         report("Erase", VERASE, CERASE);
201                         report("Kill", VKILL, CKILL);
202                         report("Interrupt", VINTR, CINTR);
203                 }
204         }
205
206         if (Sflag) {
207                 (void)printf("%s ", ttype);
208                 if (strlen(tcapbuf) > 0)
209                         wrtermcap(tcapbuf);
210         }
211
212         if (sflag) {
213                 /*
214                  * Figure out what shell we're using.  A hack, we look for an
215                  * environmental variable SHELL ending in "csh".
216                  */
217                 if ((p = getenv("SHELL")) &&
218                     !strcmp(p + strlen(p) - 3, "csh")) {
219                         printf("set noglob;\nsetenv TERM %s;\n", ttype);
220                         if (strlen(tcapbuf) > 0) {
221                                 printf("setenv TERMCAP '");
222                                 wrtermcap(tcapbuf);
223                                 printf("';\n");
224                         }
225                         printf("unset noglob;\n");
226                 } else {
227                         printf("TERM=%s;\n", ttype);
228                         if (strlen(tcapbuf) > 0) {
229                                 printf("TERMCAP='");
230                                 wrtermcap(tcapbuf);
231                                 printf("';\nexport TERMCAP;\n");
232                         }
233                         printf("export TERM;\n");
234                 }
235         }
236
237         exit(0);
238 }
239
240 /*
241  * Tell the user if a control key has been changed from the default value.
242  */
243 void
244 report(const char *name, int which, u_int def)
245 {
246         u_int old, new;
247
248         new = mode.c_cc[which];
249         old = oldmode.c_cc[which];
250
251         if (old == new && old == def)
252                 return;
253
254         (void)fprintf(stderr, "%s %s ", name, old == new ? "is" : "set to");
255
256         if (new == 010)
257                 (void)fprintf(stderr, "backspace.\n");
258         else if (new == 0177)
259                 (void)fprintf(stderr, "delete.\n");
260         else if (new < 040) {
261                 new ^= 0100;
262                 (void)fprintf(stderr, "control-%c (^%c).\n", new, new);
263         } else
264                 (void)fprintf(stderr, "%c.\n", new);
265 }
266
267 /*
268  * Convert the obsolete argument form into something that getopt can handle.
269  * This means that -e, -i and -k get default arguments supplied for them.
270  */
271 void
272 obsolete(char *argv[])
273 {
274         for (; *argv; ++argv) {
275                 if (argv[0][0] != '-' || (argv[1] && argv[1][0] != '-') ||
276                     (argv[0][1] != 'e' && argv[0][1] != 'i' && argv[0][1] != 'k') ||
277                         argv[0][2] != '\0')
278                         continue;
279                 switch(argv[0][1]) {
280                 case 'e':
281                         argv[0] = strdup("-e^H");
282                         break;
283                 case 'i':
284                         argv[0] = strdup("-i^C");
285                         break;
286                 case 'k':
287                         argv[0] = strdup("-k^U");
288                         break;
289                 }
290         }
291 }
292
293 void
294 usage(void)
295 {
296         (void)fprintf(stderr, "%s\n%s\n",
297 "usage: tset  [-IQrSs] [-] [-e ch] [-i ch] [-k ch] [-m mapping] [terminal]",
298 "       reset [-IQrSs] [-] [-e ch] [-i ch] [-k ch] [-m mapping] [terminal]");
299         exit(1);
300 }
301