untic.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (c) 1996, by Sun Microsystems, Inc.
* All rights reserved.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
/*
* untic.c CURSES Library
*
* Copyright 1990, 1992 by Mortice Kern Systems Inc. All rights reserved.
*
* Portions of this code Copyright 1982 by Pavel Curtis.
*
*/
#ifdef M_RCSID
#ifndef lint
static char rcsID[] = "$Header: /rd/src/tic/rcs/untic.c 1.18 1995/06/22 20:04:01 ant Exp $";
#endif
#endif
#include <mks.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <term.h>
#include <unistd.h>
#include <m_ord.h>
#ifdef _XOPEN_CURSES
/*
* MKS XCurses to be conforming has to avoid name space pollution
* by using reserved prefixes. Map the pre-XCurses names to the
* new ones.
*/
#define BOOLCOUNT __COUNT_BOOL
#define NUMCOUNT __COUNT_NUM
#define STRCOUNT __COUNT_STR
#define boolnames __m_boolnames
#define boolcodes __m_boolcodes
#define boolfnames __m_boolfnames
#define numnames __m_numnames
#define numcodes __m_numcodes
#define numfnames __m_numfnames
#define strnames __m_strnames
#define strcodes __m_strcodes
#define strfnames __m_strfnames
#define __t_term_header terminfo_header_t
#define TERMINFO_MAGIC __TERMINFO_MAGIC
#define Booleans _bool
#define Numbers _num
#define Strings _str
#define term_names _names
#endif
extern char *_cmdname;
/* Exit Status */
#define SUCCESS 0
#define NOT_DEFINED 1
#define USAGE 2
#define BAD_TERMINAL 3
#define NOT_VALID 4
#define ERROR 5
STATIC char *escape ANSI((int));
STATIC void error ANSI((char *, ...)); /* GENTEXT: error */
STATIC void untic ANSI((TERMINAL *));
char **Bool;
char **Num;
char **Str;
char usage[] = m_textstr(3137, "usage: %s [-CILV] [term_name ...]\n", "U _");
char version[] = m_textstr(
3138, "%s - Display compiled terminfo database entry. Oct 92\n", "I _"
);
int
main(argc, argv)
int argc;
char **argv;
{
int err;
char *ap, **av = argv;
setlocale(LC_ALL, "");
_cmdname = *argv;
Bool = boolnames;
Num = numnames;
Str = strnames;
for (--argc, ++argv; 0 < argc && **argv == '-'; --argc, ++argv) {
ap = &argv[0][1];
if (*ap == '-' && ap[1] == '\0') {
--argc;
++argv;
break;
}
while (*ap != '\0') {
switch (*ap++) {
case 'C':
Bool = boolcodes;
Num = numcodes;
Str = strcodes;
break;
case 'I':
Bool = boolnames;
Num = numnames;
Str = strnames;
break;
case 'L':
Bool = boolfnames;
Num = numfnames;
Str = strfnames;
break;
case 'V':
(void) fprintf(
stderr, m_strmsg(version), _cmdname
);
break;
default:
(void) fprintf(
stderr, m_strmsg(usage), _cmdname
);
return (USAGE);
}
break;
}
}
if (argc <= 0) {
if ((ap = getenv("TERM")) == NULL) {
(void) fprintf(stderr, m_strmsg(usage), _cmdname);
return (USAGE);
}
/* Assume that, even if there were no parameters, space
* for argv[0] (the command name) and argv[1] (NULL) would
* have been put aside. We can use this space to fake a
* a single default parameter.
*/
argc = 1;
argv[0] = ap;
argv[1] = NULL;
}
use_env(0);
for (; 0 < argc; --argc, ++argv) {
(void) setupterm(*argv, STDOUT_FILENO, &err);
switch (err) {
case 1:
untic(cur_term);
(void) del_curterm(cur_term);
break;
case 0:
error(
m_textmsg(202, "Unknown terminal \"%s\".\n", "E term"),
*argv
);
return (BAD_TERMINAL);
case -1:
error(m_textmsg(203, "No terminfo database.\n", "E"));
return (BAD_TERMINAL);
}
}
return (SUCCESS);
}
/*f
* Dump the contents of a compiled terminfo file into a
* human readable format.
*/
STATIC void
untic(tp)
TERMINAL *tp;
{
int i;
char *p;
(void) printf("%s,\n", tp->term_names);
for (i = 0; i < BOOLCOUNT; ++i) {
if (tp->Booleans[i])
(void) printf("\t%s,\n", Bool[i]);
}
for (i = 0; i < NUMCOUNT; ++i) {
if (tp->Numbers[i] != -1)
(void) printf("\t%s#%d,\n", Num[i],tp->Numbers[i]);
}
for (i = 0; i < STRCOUNT; ++i) {
if (tp->Strings[i] != NULL) {
(void) printf("\t%s=", Str[i]);
for (p = tp->Strings[i]; *p != '\0'; ++p)
(void) fputs(escape(*p), stdout);
(void) fputs(",\n", stdout);
}
}
(void) putchar('\n');
}
/*f
* Display error message.
*/
STATIC void
error VARARG1(char*, fmt)
{
va_list ap;
(void) fprintf(stderr, "%s: ", _cmdname);
va_start(ap, fmt);
(void) vfprintf(stderr, fmt, ap);
va_end(ap);
}
/*f
* This routine is a codeset independent method of specifying a translation
* from an internal binary value, to an unambiguous printable format.
* This mapping is defined by Table 2-13 in section 2-12 of POSIX.2.
*
* This table has been extended to account for tic/infocmp specification
* of additional characters: <escape>, <space>, <colon>, <caret>, <comma>
*/
char *
escape(c)
int c;
{
int i;
static char buf[5];
static int cntl_code[] = {
'\0', '\\', M_ALERT, '\b', '\f', '\n', '\r', '\t',
M_VTAB, M_ESCAPE, ' ', ':', '^', ',',
-1
};
static char *cntl_str[] = {
"\\0", "\\\\", "\\a", "\\b", "\\f", "\\n", "\\r", "\\t",
"\\v", "\\E", "\\s", "\\:", "\\^", "\\,"
};
for (i = 0; cntl_code[i] != -1; ++i)
if (c == cntl_code[i])
return (cntl_str[i]);
if (!isprint(c))
(void) sprintf(buf, "\\%03.3o", (unsigned char) c);
else
buf[0] = c, buf[1] = '\0';
return (buf);
}