/****************************************************************************
- * Copyright (c) 1998-2002,2003 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2004,2005 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
/****************************************************************************
* Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
* and: Eric S. Raymond <esr@snark.thyrsus.com> *
+ * and: Thomas E. Dickey 1996-on *
* *
* some of the code in here was contributed by: *
* Magnus Bengtsson, d6mbeng@dtek.chalmers.se (Nov'93) *
#include <term_entry.h>
-MODULE_ID("$Id: lib_termcap.c,v 1.44 2003/05/24 21:10:28 tom Exp $")
-
-#define CSI 233
-#define ESC 033 /* ^[ */
-#define L_BRACK '['
-#define SHIFT_OUT 017 /* ^N */
+MODULE_ID("$Id: lib_termcap.c,v 1.51 2005/07/16 23:12:51 tom Exp $")
NCURSES_EXPORT_VAR(char *) UP = 0;
NCURSES_EXPORT_VAR(char *) BC = 0;
-static char *fix_me = 0;
-
-static char *
-set_attribute_9(int flag)
-{
- const char *result;
-
- if ((result = tparm(set_attributes, 0, 0, 0, 0, 0, 0, 0, 0, flag)) == 0)
- result = "";
- return strdup(result);
-}
-
-static int
-is_csi(char *s)
-{
- if (UChar(s[0]) == CSI)
- return 1;
- else if (s[0] == ESC && s[1] == L_BRACK)
- return 2;
- return 0;
-}
-
-static char *
-skip_zero(char *s)
-{
- if (s[0] == '0') {
- if (s[1] == ';')
- s += 2;
- else if (isalpha(UChar(s[1])))
- s += 1;
- }
- return s;
-}
-
-static bool
-similar_sgr(char *a, char *b)
-{
- int csi_a = is_csi(a);
- int csi_b = is_csi(b);
-
- if (csi_a != 0 && csi_b != 0 && csi_a == csi_b) {
- a += csi_a;
- b += csi_b;
- if (*a != *b) {
- a = skip_zero(a);
- b = skip_zero(b);
- }
- }
- return strcmp(a, b) == 0;
-}
+static char *fix_me = 0; /* this holds the filtered sgr0 string */
/***************************************************************************
*
{
int errcode;
+ START_TRACE();
T((T_CALLED("tgetent()")));
- setupterm((NCURSES_CONST char *) name, STDOUT_FILENO, &errcode);
+ _nc_setupterm((NCURSES_CONST char *) name, STDOUT_FILENO, &errcode, TRUE);
PC = 0;
UP = 0;
BC = 0;
- fix_me = 0;
+ fix_me = 0; /* don't free it - application may still use */
if (errcode == 1) {
if (backspace_if_not_bs != NULL)
BC = backspace_if_not_bs;
- /*
- * While 'sgr0' is the "same" as termcap 'me', there is a compatibility
- * issue. The sgr/sgr0 capabilities include setting/clearing alternate
- * character set mode. A termcap application cannot use sgr, so sgr0
- * strings that reset alternate character set mode will be
- * misinterpreted. Here, we remove those from the more common
- * ISO/ANSI/VT100 entries, which have sgr0 agreeing with sgr.
- */
- if (exit_attribute_mode != 0
- && set_attributes != 0) {
- char *on = set_attribute_9(1);
- char *off = set_attribute_9(0);
- char *tmp;
- size_t i, j, k;
-
- if (similar_sgr(off, exit_attribute_mode)
- && !similar_sgr(off, on)) {
- TR(TRACE_DATABASE, ("adjusting sgr0 : %s", _nc_visbuf(off)));
- FreeIfNeeded(fix_me);
- fix_me = off;
- for (i = 0; off[i] != '\0'; ++i) {
- if (on[i] != off[i]) {
- j = strlen(off);
- k = strlen(on);
- while (j != 0
- && k != 0
- && off[j - 1] == on[k - 1]) {
- --j, --k;
- }
- while (off[j] != '\0') {
- off[i++] = off[j++];
- }
- off[i] = '\0';
- break;
- }
- }
- /* SGR 10 would reset to normal font */
- if ((i = is_csi(off)) != 0
- && off[strlen(off) - 1] == 'm') {
- tmp = skip_zero(off + i);
- if (tmp[0] == '1'
- && skip_zero(tmp + 1) != tmp + 1) {
- i = tmp - off;
- if (off[i - 1] == ';')
- i--;
- j = skip_zero(tmp + 1) - off;
- while (off[j] != '\0') {
- off[i++] = off[j++];
- }
- off[i] = '\0';
- }
- }
- TR(TRACE_DATABASE, ("...adjusted me : %s", _nc_visbuf(fix_me)));
- if (!strcmp(fix_me, exit_attribute_mode)) {
- TR(TRACE_DATABASE, ("...same result, discard"));
+ FreeIfNeeded(fix_me);
+ if ((fix_me = _nc_trim_sgr0(&(cur_term->type))) != 0) {
+ if (!strcmp(fix_me, exit_attribute_mode)) {
+ if (fix_me != exit_attribute_mode) {
free(fix_me);
- fix_me = 0;
}
+ fix_me = 0;
}
- free(on);
}
(void) baudrate(); /* sets ospeed as a side-effect */