1 /* $NetBSD: tput.c,v 1.18 2007/12/15 19:44:53 perry Exp $ */
4 * Copyright (c) 1980, 1988, 1993
5 * The Regents of the University of California. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 #include <sys/cdefs.h>
34 __COPYRIGHT("@(#) Copyright (c) 1980, 1988, 1993\
35 The Regents of the University of California. All rights reserved.");
40 static char sccsid
[] = "@(#)tput.c 8.3 (Berkeley) 4/28/95";
42 __RCSID("$NetBSD: tput.c,v 1.18 2007/12/15 19:44:53 perry Exp $");
55 static void prlongname(char *);
56 static void setospeed(void);
57 static void usage(void) __dead
;
58 static char **process(const char *, char *, char **);
61 main(int argc
, char **argv
)
64 char *cptr
, *term
, buf
[1024], tbuf
[1024];
68 while ((ch
= getopt(argc
, argv
, "T:")) != -1)
80 if (!term
&& !(term
= getenv("TERM")))
81 errx(2, "No terminal type specified and no TERM "
82 "variable set in the environment.");
83 if (tgetent(tbuf
, term
) != 1)
84 err(2, "tgetent failure");
86 for (exitval
= 0; (p
= *argv
) != NULL
; ++argv
) {
89 if (!strcmp(p
, "clear"))
93 if (!strcmp(p
, "init"))
97 if (!strcmp(p
, "longname")) {
103 if (!strcmp(p
, "reset"))
108 if (tgetstr(p
, &cptr
))
109 argv
= process(p
, buf
, argv
);
110 else if ((n
= tgetnum(p
)) != -1)
111 (void)printf("%d\n", n
);
113 exitval
= !tgetflag(p
);
118 return argv
? exitval
: 2;
122 prlongname(char *buf
)
127 for (p
= buf
; *p
&& *p
!= ':'; ++p
)
129 savech
= *(savep
= p
);
130 for (*p
= '\0'; p
>= buf
&& *p
!= '|'; --p
)
132 (void)printf("%s\n", p
+ 1);
137 process(const char *cap
, char *str
, char **argv
)
139 static const char errfew
[] =
140 "Not enough arguments (%d) for capability `%s'";
141 static const char errmany
[] =
142 "Too many arguments (%d) for capability `%s'";
143 static const char erresc
[] =
144 "Unknown %% escape `%c' for capability `%s'";
146 int arg_need
, arg_rows
, arg_cols
;
148 /* Count how many values we need for this capability. */
149 for (cp
= str
, arg_need
= 0; *cp
!= '\0'; cp
++)
169 * hpux has lot's of them, but we complain
171 errx(2, erresc
, *cp
, cap
);
174 /* And print them. */
177 (void)tputs(str
, 1, outc
);
182 if (*++argv
== NULL
|| *argv
[0] == '\0')
183 errx(2, errfew
, 1, cap
);
184 arg_rows
= atoi(*argv
);
186 (void)tputs(tgoto(str
, arg_cols
, arg_rows
), 1, outc
);
189 if (*++argv
== NULL
|| *argv
[0] == '\0')
190 errx(2, errfew
, 2, cap
);
191 arg_rows
= atoi(*argv
);
193 if (*++argv
== NULL
|| *argv
[0] == '\0')
194 errx(2, errfew
, 2, cap
);
195 arg_cols
= atoi(*argv
);
197 (void)tputs(tgoto(str
, arg_cols
, arg_rows
), arg_rows
, outc
);
201 errx(2, errmany
, arg_need
, cap
);
213 if (tcgetattr(STDOUT_FILENO
, &t
) != -1)
216 ospeed
= cfgetospeed(&t
);
229 (void)fprintf(stderr
,
230 "Usage: %s [-T term] attribute [attribute-args] ...\n",