summaryrefslogtreecommitdiffstats
path: root/contrib/ncurses
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/ncurses')
-rw-r--r--contrib/ncurses/ncurses/tinfo/comp_scan.c530
-rw-r--r--contrib/ncurses/ncurses/tinfo/lib_baudrate.c4
-rw-r--r--contrib/ncurses/ncurses/tinfo/lib_raw.c228
-rw-r--r--contrib/ncurses/ncurses/tinfo/lib_termcap.c228
4 files changed, 452 insertions, 538 deletions
diff --git a/contrib/ncurses/ncurses/tinfo/comp_scan.c b/contrib/ncurses/ncurses/tinfo/comp_scan.c
index e937f7e..7e08fc0 100644
--- a/contrib/ncurses/ncurses/tinfo/comp_scan.c
+++ b/contrib/ncurses/ncurses/tinfo/comp_scan.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2005,2006 Free Software Foundation, Inc. *
+ * Copyright (c) 1998,1999,2000,2001 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 *
@@ -29,9 +29,10 @@
/****************************************************************************
* Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
* and: Eric S. Raymond <esr@snark.thyrsus.com> *
- * and: Thomas E. Dickey 1996 on *
****************************************************************************/
+/* $FreeBSD$ */
+
/*
* comp_scan.c --- Lexical scanner for terminfo compiler.
*
@@ -51,7 +52,7 @@
#include <term_entry.h>
#include <tic.h>
-MODULE_ID("$Id: comp_scan.c,v 1.78 2006/12/16 19:17:01 tom Exp $")
+MODULE_ID("$Id: comp_scan.c,v 1.59 2001/09/23 00:56:29 tom Exp $")
/*
* Maximum length of string capability we'll accept before raising an error.
@@ -85,7 +86,6 @@ _nc_curr_token =
*****************************************************************************/
static bool first_column; /* See 'next_char()' below */
-static bool had_newline;
static char separator; /* capability separator */
static int pushtype; /* type of pushback token */
static char *pushname;
@@ -95,196 +95,14 @@ NCURSES_EXPORT_VAR(bool)
_nc_disable_period = FALSE; /* used by tic -a option */
#endif
-/*****************************************************************************
- *
- * Character-stream handling
- *
- *****************************************************************************/
-
-#define LEXBUFSIZ 1024
-
-static char *bufptr; /* otherwise, the input buffer pointer */
-static char *bufstart; /* start of buffer so we can compute offsets */
-static FILE *yyin; /* scanner's input file descriptor */
-
-/*
- * _nc_reset_input()
- *
- * Resets the input-reading routines. Used on initialization,
- * or after a seek has been done. Exactly one argument must be
- * non-null.
- */
-
-NCURSES_EXPORT(void)
-_nc_reset_input(FILE *fp, char *buf)
-{
- pushtype = NO_PUSHBACK;
- if (pushname != 0)
- pushname[0] = '\0';
- yyin = fp;
- bufstart = bufptr = buf;
- _nc_curr_file_pos = 0L;
- if (fp != 0)
- _nc_curr_line = 0;
- _nc_curr_col = 0;
-}
-
-/*
- * int last_char()
- *
- * Returns the final nonblank character on the current input buffer
- */
-static int
-last_char(void)
-{
- size_t len = strlen(bufptr);
- while (len--) {
- if (!isspace(UChar(bufptr[len])))
- return bufptr[len];
- }
- return 0;
-}
-
-/*
- * int next_char()
- *
- * Returns the next character in the input stream. Comments and leading
- * white space are stripped.
- *
- * The global state variable 'firstcolumn' is set TRUE if the character
- * returned is from the first column of the input line.
- *
- * The global variable _nc_curr_line is incremented for each new line.
- * The global variable _nc_curr_file_pos is set to the file offset of the
- * beginning of each line.
- */
-
-static int
-next_char(void)
-{
- static char *result;
- static size_t allocated;
- int the_char;
-
- if (!yyin) {
- if (result != 0) {
- FreeAndNull(result);
- FreeAndNull(pushname);
- allocated = 0;
- }
- /*
- * An string with an embedded null will truncate the input. This is
- * intentional (we don't read binary files here).
- */
- if (bufptr == 0 || *bufptr == '\0')
- return (EOF);
- if (*bufptr == '\n') {
- _nc_curr_line++;
- _nc_curr_col = 0;
- } else if (*bufptr == '\t') {
- _nc_curr_col = (_nc_curr_col | 7);
- }
- } else if (!bufptr || !*bufptr) {
- /*
- * In theory this could be recoded to do its I/O one character at a
- * time, saving the buffer space. In practice, this turns out to be
- * quite hard to get completely right. Try it and see. If you
- * succeed, don't forget to hack push_back() correspondingly.
- */
- size_t used;
- size_t len;
-
- do {
- bufstart = 0;
- used = 0;
- do {
- if (used + (LEXBUFSIZ / 4) >= allocated) {
- allocated += (allocated + LEXBUFSIZ);
- result = typeRealloc(char, allocated, result);
- if (result == 0)
- return (EOF);
- }
- if (used == 0)
- _nc_curr_file_pos = ftell(yyin);
-
- if (fgets(result + used, (int) (allocated - used), yyin) != 0) {
- bufstart = result;
- if (used == 0) {
- _nc_curr_line++;
- _nc_curr_col = 0;
- }
- } else {
- if (used != 0)
- strcat(result, "\n");
- }
- if ((bufptr = bufstart) != 0) {
- used = strlen(bufptr);
- while (iswhite(*bufptr)) {
- if (*bufptr == '\t') {
- _nc_curr_col = (_nc_curr_col | 7) + 1;
- } else {
- _nc_curr_col++;
- }
- bufptr++;
- }
-
- /*
- * Treat a trailing <cr><lf> the same as a <newline> so we
- * can read files on OS/2, etc.
- */
- if ((len = strlen(bufptr)) > 1) {
- if (bufptr[len - 1] == '\n'
- && bufptr[len - 2] == '\r') {
- len--;
- bufptr[len - 1] = '\n';
- bufptr[len] = '\0';
- }
- }
- } else {
- return (EOF);
- }
- } while (bufptr[len - 1] != '\n'); /* complete a line */
- } while (result[0] == '#'); /* ignore comments */
- } else if (*bufptr == '\t') {
- _nc_curr_col = (_nc_curr_col | 7);
- }
-
- first_column = (bufptr == bufstart);
- if (first_column)
- had_newline = FALSE;
-
- _nc_curr_col++;
- the_char = *bufptr++;
- return UChar(the_char);
-}
-
-static void
-push_back(char c)
-/* push a character back onto the input stream */
-{
- if (bufptr == bufstart)
- _nc_syserr_abort("Can't backspace off beginning of line");
- *--bufptr = c;
- _nc_curr_col--;
-}
-
-static long
-stream_pos(void)
-/* return our current character position in the input stream */
-{
- return (yyin ? ftell(yyin) : (bufptr ? bufptr - bufstart : 0));
-}
-
-static bool
-end_of_stream(void)
-/* are we at end of input? */
-{
- return ((yyin ? feof(yyin) : (bufptr && *bufptr == '\0'))
- ? TRUE : FALSE);
-}
+static int last_char(void);
+static int next_char(void);
+static long stream_pos(void);
+static bool end_of_stream(void);
+static void push_back(char c);
/* Assume we may be looking at a termcap-style continuation */
-static NCURSES_INLINE int
+static inline int
eat_escaped_newline(int ch)
{
if (ch == '\\')
@@ -332,11 +150,8 @@ _nc_get_token(bool silent)
static const char terminfo_punct[] = "@%&*!#";
static char *buffer;
- char *after_list;
- char *after_name;
char *numchk;
char *ptr;
- char *s;
char numbuf[80];
int ch;
int dot_flag = FALSE;
@@ -344,10 +159,6 @@ _nc_get_token(bool silent)
long number;
long token_start;
unsigned found;
-#ifdef TRACE
- int old_line;
- int old_col;
-#endif
if (pushtype != NO_PUSHBACK) {
int retval = pushtype;
@@ -364,31 +175,16 @@ _nc_get_token(bool silent)
return (retval);
}
- if (end_of_stream()) {
- yyin = 0;
- next_char(); /* frees its allocated memory */
- if (buffer != 0) {
- if (_nc_curr_token.tk_name == buffer)
- _nc_curr_token.tk_name = 0;
- FreeAndNull(buffer);
- }
+ if (end_of_stream())
return (EOF);
- }
start_token:
token_start = stream_pos();
- while ((ch = next_char()) == '\n' || iswhite(ch)) {
- if (ch == '\n')
- had_newline = TRUE;
+ while ((ch = next_char()) == '\n' || iswhite(ch))
continue;
- }
ch = eat_escaped_newline(ch);
-#ifdef TRACE
- old_line = _nc_curr_line;
- old_col = _nc_curr_col;
-#endif
if (ch == EOF)
type = EOF;
else {
@@ -414,44 +210,36 @@ _nc_get_token(bool silent)
}
/* have to make some punctuation chars legal for terminfo */
- if (!isalnum(UChar(ch))
+ if (!isalnum(ch)
#if NCURSES_EXT_FUNCS
&& !(ch == '.' && _nc_disable_period)
#endif
&& !strchr(terminfo_punct, (char) ch)) {
if (!silent)
- _nc_warning("Illegal character (expected alphanumeric or %s) - '%s'",
+ _nc_warning("Illegal character (expected alphanumeric or %s) - %s",
terminfo_punct, unctrl((chtype) ch));
_nc_panic_mode(separator);
goto start_token;
}
if (buffer == 0)
- buffer = typeMalloc(char, MAX_ENTRY_SIZE);
+ buffer = _nc_doalloc(buffer, MAX_ENTRY_SIZE);
-#ifdef TRACE
- old_line = _nc_curr_line;
- old_col = _nc_curr_col;
-#endif
ptr = buffer;
*(ptr++) = ch;
if (first_column) {
+ char *desc;
+
_nc_comment_start = token_start;
_nc_comment_end = _nc_curr_file_pos;
_nc_start_line = _nc_curr_line;
_nc_syntax = ERR;
- after_name = 0;
- after_list = 0;
while ((ch = next_char()) != '\n') {
- if (ch == EOF) {
- _nc_err_abort(MSG_NO_INPUTS);
- } else if (ch == '|') {
- after_list = ptr;
- if (after_name == 0)
- after_name = ptr;
- } else if (ch == ':' && last_char() != ',') {
+ if (ch == EOF)
+ _nc_err_abort("premature EOF");
+ else if (ch == ':' && last_char() != ',') {
_nc_syntax = SYN_TERMCAP;
separator = ':';
break;
@@ -459,18 +247,14 @@ _nc_get_token(bool silent)
_nc_syntax = SYN_TERMINFO;
separator = ',';
/*
- * If we did not see a '|', then we found a name with no
- * aliases or description.
- */
- if (after_name == 0)
- break;
- /*
- * If we see a comma, we assume this is terminfo unless we
- * subsequently run into a colon. But we don't stop
- * looking for a colon until hitting a newline. This
+ * Fall-through here is not an accident. The idea is that
+ * if we see a comma, we figure this is terminfo unless we
+ * subsequently run into a colon -- but we don't stop
+ * looking for that colon until hitting a newline. This
* allows commas to be embedded in description fields of
* either syntax.
*/
+ /* FALLTHRU */
} else
ch = eat_escaped_newline(ch);
@@ -495,62 +279,60 @@ _nc_get_token(bool silent)
/*
* This is the soonest we have the terminal name fetched. Set up
- * for following warning messages. If there's no '|', then there
- * is no description.
+ * for following warning messages.
*/
- if (after_name != 0) {
- ch = *after_name;
- *after_name = '\0';
- _nc_set_type(buffer);
- *after_name = ch;
- }
+ ptr = strchr(buffer, '|');
+ if (ptr == (char *) NULL)
+ ptr = buffer + strlen(buffer);
+ ch = *ptr;
+ *ptr = '\0';
+ _nc_set_type(buffer);
+ *ptr = ch;
/*
* Compute the boundary between the aliases and the description
* field for syntax-checking purposes.
*/
- if (after_list != 0) {
- if (!silent) {
- if (*after_list == '\0')
- _nc_warning("empty longname field");
- else if (strchr(after_list, ' ') == 0)
- _nc_warning("older tic versions may treat the description field as an alias");
- }
- } else {
- after_list = buffer + strlen(buffer);
- DEBUG(1, ("missing description"));
+ desc = strrchr(buffer, '|');
+ if (!silent && desc) {
+ if (*desc == '\0')
+ _nc_warning("empty longname field");
+#ifndef FREEBSD_NATIVE
+ else if (strchr(desc, ' ') == (char *) NULL)
+ _nc_warning("older tic versions may treat the description field as an alias");
+#endif
}
+ if (!desc)
+ desc = buffer + strlen(buffer);
/*
* Whitespace in a name field other than the long name can confuse
* rdist and some termcap tools. Slashes are a no-no. Other
* special characters can be dangerous due to shell expansion.
*/
- for (s = buffer; s < after_list; ++s) {
- if (isspace(UChar(*s))) {
+ for (ptr = buffer; ptr < desc; ptr++) {
+ if (isspace(UChar(*ptr))) {
if (!silent)
_nc_warning("whitespace in name or alias field");
break;
- } else if (*s == '/') {
+ } else if (*ptr == '/') {
if (!silent)
_nc_warning("slashes aren't allowed in names or aliases");
break;
- } else if (strchr("$[]!*?", *s)) {
+ } else if (strchr("$[]!*?", *ptr)) {
if (!silent)
- _nc_warning("dubious character `%c' in name or alias field", *s);
+ _nc_warning("dubious character `%c' in name or alias field", *ptr);
break;
}
}
+ ptr = buffer;
+
_nc_curr_token.tk_name = buffer;
type = NAMES;
} else {
- if (had_newline && _nc_syntax == SYN_TERMCAP) {
- _nc_warning("Missing backslash before newline");
- had_newline = FALSE;
- }
while ((ch = next_char()) != EOF) {
- if (!isalnum(UChar(ch))) {
+ if (!isalnum(ch)) {
if (_nc_syntax == SYN_TERMINFO) {
if (ch != '_')
break;
@@ -615,7 +397,7 @@ _nc_get_token(bool silent)
/* just to get rid of the compiler warning */
type = UNDEF;
if (!silent)
- _nc_warning("Illegal character - '%s'", unctrl((chtype) ch));
+ _nc_warning("Illegal character - %s", unctrl((chtype) ch));
}
} /* end else (first_column == FALSE) */
} /* end else (ch != EOF) */
@@ -626,11 +408,6 @@ _nc_get_token(bool silent)
if (dot_flag == TRUE)
DEBUG(8, ("Commented out "));
- if (_nc_tracing >= DEBUG_LEVEL(8)) {
- _tracef("parsed %d.%d to %d.%d",
- old_line, old_col,
- _nc_curr_line, _nc_curr_col);
- }
if (_nc_tracing >= DEBUG_LEVEL(7)) {
switch (type) {
case BOOLEAN:
@@ -675,9 +452,8 @@ _nc_get_token(bool silent)
type = _nc_get_token(silent);
DEBUG(3, ("token: `%s', class %d",
- ((_nc_curr_token.tk_name != 0)
- ? _nc_curr_token.tk_name
- : "<null>"),
+ _nc_curr_token.tk_name != 0 ? _nc_curr_token.tk_name :
+ "<null>",
type));
return (type);
@@ -702,7 +478,7 @@ _nc_get_token(bool silent)
*
*/
-NCURSES_EXPORT(int)
+NCURSES_EXPORT(char)
_nc_trans_string(char *ptr, char *last)
{
int count = 0;
@@ -720,10 +496,10 @@ _nc_trans_string(char *ptr, char *last)
if (ch == '^' && last_ch != '%') {
ch = c = next_char();
if (c == EOF)
- _nc_err_abort(MSG_NO_INPUTS);
+ _nc_err_abort("Premature EOF");
if (!(is7bits(ch) && isprint(ch))) {
- _nc_warning("Illegal ^ character - '%s'", unctrl(ch));
+ _nc_warning("Illegal ^ character - %s", unctrl(ch));
}
if (ch == '?') {
*(ptr++) = '\177';
@@ -737,14 +513,14 @@ _nc_trans_string(char *ptr, char *last)
} else if (ch == '\\') {
ch = c = next_char();
if (c == EOF)
- _nc_err_abort(MSG_NO_INPUTS);
+ _nc_err_abort("Premature EOF");
if (ch >= '0' && ch <= '7') {
number = ch - '0';
for (i = 0; i < 2; i++) {
ch = c = next_char();
if (c == EOF)
- _nc_err_abort(MSG_NO_INPUTS);
+ _nc_err_abort("Premature EOF");
if (c < '0' || c > '7') {
if (isdigit(c)) {
@@ -818,31 +594,21 @@ _nc_trans_string(char *ptr, char *last)
continue;
default:
- _nc_warning("Illegal character '%s' in \\ sequence",
+ _nc_warning("Illegal character %s in \\ sequence",
unctrl(ch));
- /* FALLTHRU */
- case '|':
*(ptr++) = (char) ch;
} /* endswitch (ch) */
} /* endelse (ch < '0' || ch > '7') */
}
/* end else if (ch == '\\') */
else if (ch == '\n' && (_nc_syntax == SYN_TERMINFO)) {
- /*
- * Newlines embedded in a terminfo string are ignored, provided
- * that the next line begins with whitespace.
- */
+ /* newlines embedded in a terminfo string are ignored */
ignored = TRUE;
} else {
*(ptr++) = (char) ch;
}
if (!ignored) {
- if (_nc_curr_col <= 1) {
- push_back(ch);
- ch = '\n';
- break;
- }
last_ch = ch;
count++;
}
@@ -877,14 +643,11 @@ _nc_push_token(int tokclass)
*/
pushtype = tokclass;
if (pushname == 0)
- pushname = typeMalloc(char, MAX_NAME_SIZE + 1);
+ pushname = _nc_doalloc(pushname, MAX_NAME_SIZE + 1);
_nc_get_type(pushname);
DEBUG(3, ("pushing token: `%s', class %d",
- ((_nc_curr_token.tk_name != 0)
- ? _nc_curr_token.tk_name
- : "<null>"),
- pushtype));
+ _nc_curr_token.tk_name, pushtype));
}
/*
@@ -904,12 +667,169 @@ _nc_panic_mode(char ch)
}
}
-#if NO_LEAKS
+/*****************************************************************************
+ *
+ * Character-stream handling
+ *
+ *****************************************************************************/
+
+#define LEXBUFSIZ 1024
+
+static char *bufptr; /* otherwise, the input buffer pointer */
+static char *bufstart; /* start of buffer so we can compute offsets */
+static FILE *yyin; /* scanner's input file descriptor */
+
+/*
+ * _nc_reset_input()
+ *
+ * Resets the input-reading routines. Used on initialization,
+ * or after a seek has been done. Exactly one argument must be
+ * non-null.
+ */
+
NCURSES_EXPORT(void)
-_nc_comp_scan_leaks(void)
+_nc_reset_input(FILE * fp, char *buf)
{
- if (pushname != 0) {
- FreeAndNull(pushname);
+ pushtype = NO_PUSHBACK;
+ if (pushname != 0)
+ pushname[0] = '\0';
+ yyin = fp;
+ bufstart = bufptr = buf;
+ _nc_curr_file_pos = 0L;
+ if (fp != 0)
+ _nc_curr_line = 0;
+ _nc_curr_col = 0;
+}
+
+/*
+ * int last_char()
+ *
+ * Returns the final nonblank character on the current input buffer
+ */
+static int
+last_char(void)
+{
+ size_t len = strlen(bufptr);
+ while (len--) {
+ if (!isspace(UChar(bufptr[len])))
+ return bufptr[len];
}
+ return 0;
+}
+
+/*
+ * int next_char()
+ *
+ * Returns the next character in the input stream. Comments and leading
+ * white space are stripped.
+ *
+ * The global state variable 'firstcolumn' is set TRUE if the character
+ * returned is from the first column of the input line.
+ *
+ * The global variable _nc_curr_line is incremented for each new line.
+ * The global variable _nc_curr_file_pos is set to the file offset of the
+ * beginning of each line.
+ */
+
+static int
+next_char(void)
+{
+ if (!yyin) {
+ /*
+ * An string with an embedded null will truncate the input. This is
+ * intentional (we don't read binary files here).
+ */
+ if (*bufptr == '\0')
+ return (EOF);
+ if (*bufptr == '\n') {
+ _nc_curr_line++;
+ _nc_curr_col = 0;
+ }
+ } else if (!bufptr || !*bufptr) {
+ /*
+ * In theory this could be recoded to do its I/O one character at a
+ * time, saving the buffer space. In practice, this turns out to be
+ * quite hard to get completely right. Try it and see. If you
+ * succeed, don't forget to hack push_back() correspondingly.
+ */
+ static char *result;
+ static size_t allocated;
+ size_t used;
+ size_t len;
+
+ do {
+ bufstart = 0;
+ used = 0;
+ do {
+ if (used + (LEXBUFSIZ / 4) >= allocated) {
+ allocated += (allocated + LEXBUFSIZ);
+ result = _nc_doalloc(result, allocated);
+ if (result == 0)
+ return (EOF);
+ }
+ if (used == 0)
+ _nc_curr_file_pos = ftell(yyin);
+
+ if (fgets(result + used, allocated - used, yyin) != NULL) {
+ bufstart = result;
+ if (used == 0) {
+ _nc_curr_line++;
+ _nc_curr_col = 0;
+ }
+ } else {
+ if (used != 0)
+ strcat(result, "\n");
+ }
+ if ((bufptr = bufstart) != 0) {
+ used = strlen(bufptr);
+ while (iswhite(*bufptr))
+ bufptr++;
+
+ /*
+ * Treat a trailing <cr><lf> the same as a <newline> so we
+ * can read files on OS/2, etc.
+ */
+ if ((len = strlen(bufptr)) > 1) {
+ if (bufptr[len - 1] == '\n'
+ && bufptr[len - 2] == '\r') {
+ len--;
+ bufptr[len - 1] = '\n';
+ bufptr[len] = '\0';
+ }
+ }
+ } else {
+ return (EOF);
+ }
+ } while (bufptr[len - 1] != '\n'); /* complete a line */
+ } while (result[0] == '#'); /* ignore comments */
+ }
+
+ first_column = (bufptr == bufstart);
+
+ _nc_curr_col++;
+ return (*bufptr++);
+}
+
+static void
+push_back(char c)
+/* push a character back onto the input stream */
+{
+ if (bufptr == bufstart)
+ _nc_syserr_abort("Can't backspace off beginning of line");
+ *--bufptr = c;
+}
+
+static long
+stream_pos(void)
+/* return our current character position in the input stream */
+{
+ return (yyin ? ftell(yyin) : (bufptr ? bufptr - bufstart : 0));
+}
+
+static bool
+end_of_stream(void)
+/* are we at end of input? */
+{
+ return ((yyin ? feof(yyin) : (bufptr && *bufptr == '\0'))
+ ? TRUE : FALSE);
}
-#endif
diff --git a/contrib/ncurses/ncurses/tinfo/lib_baudrate.c b/contrib/ncurses/ncurses/tinfo/lib_baudrate.c
index 5238924..15ba3bb 100644
--- a/contrib/ncurses/ncurses/tinfo/lib_baudrate.c
+++ b/contrib/ncurses/ncurses/tinfo/lib_baudrate.c
@@ -31,6 +31,8 @@
* and: Eric S. Raymond <esr@snark.thyrsus.com> *
****************************************************************************/
+/* $FreeBSD$ */
+
/*
* lib_baudrate.c
*
@@ -46,7 +48,7 @@
* of the indices up to B115200 fit nicely in a 'short', allowing us to retain
* ospeed's type for compatibility.
*/
-#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
+#if defined(__NetBSD__) || defined(__OpenBSD__)
#undef B0
#undef B50
#undef B75
diff --git a/contrib/ncurses/ncurses/tinfo/lib_raw.c b/contrib/ncurses/ncurses/tinfo/lib_raw.c
index aa09f52..2269b5b 100644
--- a/contrib/ncurses/ncurses/tinfo/lib_raw.c
+++ b/contrib/ncurses/ncurses/tinfo/lib_raw.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2001,2002 Free Software Foundation, Inc. *
+ * Copyright (c) 1998,1999,2000,2001 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 *
@@ -29,9 +29,10 @@
/****************************************************************************
* Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
* and: Eric S. Raymond <esr@snark.thyrsus.com> *
- * and: Thomas E. Dickey 1998 on *
****************************************************************************/
+/* $FreeBSD$ */
+
/*
* raw.c
*
@@ -49,7 +50,7 @@
#include <curses.priv.h>
#include <term.h> /* cur_term */
-MODULE_ID("$Id: lib_raw.c,v 1.13 2002/07/06 22:00:45 tom Exp $")
+MODULE_ID("$Id: lib_raw.c,v 1.12 2001/08/04 17:18:38 tom Exp $")
#if SVR4_TERMIO && !defined(_POSIX_SOURCE)
#define _POSIX_SOURCE
@@ -61,9 +62,6 @@ MODULE_ID("$Id: lib_raw.c,v 1.13 2002/07/06 22:00:45 tom Exp $")
#ifdef __EMX__
#include <io.h>
-#define _nc_setmode(mode) setmode(SP->_ifd, mode)
-#else
-#define _nc_setmode(mode) /* nothing */
#endif
#define COOKED_INPUT (IXON|BRKINT|PARMRK)
@@ -79,218 +77,162 @@ MODULE_ID("$Id: lib_raw.c,v 1.13 2002/07/06 22:00:45 tom Exp $")
NCURSES_EXPORT(int)
raw(void)
{
- int result = ERR;
-
T((T_CALLED("raw()")));
-
if (SP != 0 && cur_term != 0) {
- TTY buf;
- BEFORE("raw");
- _nc_setmode(O_BINARY);
+ SP->_raw = TRUE;
+ SP->_cbreak = 1;
+
+#ifdef __EMX__
+ setmode(SP->_ifd, O_BINARY);
+#endif
- buf = cur_term->Nttyb;
#ifdef TERMIOS
- buf.c_lflag &= ~(ICANON | ISIG | IEXTEN);
- buf.c_iflag &= ~(COOKED_INPUT);
- buf.c_cc[VMIN] = 1;
- buf.c_cc[VTIME] = 0;
+ BEFORE("raw");
+ cur_term->Nttyb.c_lflag &= ~(ICANON | ISIG | IEXTEN);
+ cur_term->Nttyb.c_iflag &= ~(COOKED_INPUT);
+ cur_term->Nttyb.c_cc[VMIN] = 1;
+ cur_term->Nttyb.c_cc[VTIME] = 0;
+ AFTER("raw");
#else
- buf.sg_flags |= RAW;
+ cur_term->Nttyb.sg_flags |= RAW;
#endif
- if ((result = _nc_set_tty_mode(&buf)) == OK) {
- SP->_raw = TRUE;
- SP->_cbreak = 1;
- cur_term->Nttyb = buf;
- }
- AFTER("raw");
+ returnCode(_nc_set_tty_mode(&cur_term->Nttyb));
}
- returnCode(result);
+ returnCode(ERR);
}
NCURSES_EXPORT(int)
cbreak(void)
{
- int result = ERR;
-
T((T_CALLED("cbreak()")));
- if (SP != 0 && cur_term != 0) {
- TTY buf;
+ SP->_cbreak = 1;
- BEFORE("cbreak");
- _nc_setmode(O_BINARY);
+#ifdef __EMX__
+ setmode(SP->_ifd, O_BINARY);
+#endif
- buf = cur_term->Nttyb;
#ifdef TERMIOS
- buf.c_lflag &= ~ICANON;
- buf.c_iflag &= ~ICRNL;
- buf.c_lflag |= ISIG;
- buf.c_cc[VMIN] = 1;
- buf.c_cc[VTIME] = 0;
+ BEFORE("cbreak");
+ cur_term->Nttyb.c_lflag &= ~ICANON;
+ cur_term->Nttyb.c_iflag &= ~ICRNL;
+ cur_term->Nttyb.c_lflag |= ISIG;
+ cur_term->Nttyb.c_cc[VMIN] = 1;
+ cur_term->Nttyb.c_cc[VTIME] = 0;
+ AFTER("cbreak");
#else
- buf.sg_flags |= CBREAK;
+ cur_term->Nttyb.sg_flags |= CBREAK;
#endif
- if ((result = _nc_set_tty_mode(&buf)) == OK) {
- SP->_cbreak = 1;
- cur_term->Nttyb = buf;
- }
- AFTER("cbreak");
- }
- returnCode(result);
+ returnCode(_nc_set_tty_mode(&cur_term->Nttyb));
}
-/*
- * Note:
- * this implementation may be wrong. See the comment under intrflush().
- */
NCURSES_EXPORT(void)
qiflush(void)
{
- int result = ERR;
-
T((T_CALLED("qiflush()")));
- if (cur_term != 0) {
- TTY buf;
+ /*
+ * Note: this implementation may be wrong. See the comment under
+ * intrflush().
+ */
- BEFORE("qiflush");
- buf = cur_term->Nttyb;
#ifdef TERMIOS
- buf.c_lflag &= ~(NOFLSH);
- result = _nc_set_tty_mode(&buf);
-#else
- /* FIXME */
+ BEFORE("qiflush");
+ cur_term->Nttyb.c_lflag &= ~(NOFLSH);
+ AFTER("qiflush");
+ (void) _nc_set_tty_mode(&cur_term->Nttyb);
#endif
- if (result == OK)
- cur_term->Nttyb = buf;
- AFTER("qiflush");
- }
returnVoid;
}
NCURSES_EXPORT(int)
noraw(void)
{
- int result = ERR;
-
T((T_CALLED("noraw()")));
- if (SP != 0 && cur_term != 0) {
- TTY buf;
+ SP->_raw = FALSE;
+ SP->_cbreak = 0;
- BEFORE("noraw");
- _nc_setmode(O_TEXT);
+#ifdef __EMX__
+ setmode(SP->_ifd, O_TEXT);
+#endif
- buf = cur_term->Nttyb;
#ifdef TERMIOS
- buf.c_lflag |= ISIG | ICANON |
- (cur_term->Ottyb.c_lflag & IEXTEN);
- buf.c_iflag |= COOKED_INPUT;
+ BEFORE("noraw");
+ cur_term->Nttyb.c_lflag |= ISIG | ICANON |
+ (cur_term->Ottyb.c_lflag & IEXTEN);
+ cur_term->Nttyb.c_iflag |= COOKED_INPUT;
+ AFTER("noraw");
#else
- buf.sg_flags &= ~(RAW | CBREAK);
+ cur_term->Nttyb.sg_flags &= ~(RAW | CBREAK);
#endif
- if ((result = _nc_set_tty_mode(&buf)) == OK) {
- SP->_raw = FALSE;
- SP->_cbreak = 0;
- cur_term->Nttyb = buf;
- }
- AFTER("noraw");
- }
- returnCode(result);
+ returnCode(_nc_set_tty_mode(&cur_term->Nttyb));
}
NCURSES_EXPORT(int)
nocbreak(void)
{
- int result = ERR;
-
T((T_CALLED("nocbreak()")));
- if (SP != 0 && cur_term != 0) {
- TTY buf;
+ SP->_cbreak = 0;
- BEFORE("nocbreak");
- _nc_setmode(O_TEXT);
+#ifdef __EMX__
+ setmode(SP->_ifd, O_TEXT);
+#endif
- buf = cur_term->Nttyb;
#ifdef TERMIOS
- buf.c_lflag |= ICANON;
- buf.c_iflag |= ICRNL;
+ BEFORE("nocbreak");
+ cur_term->Nttyb.c_lflag |= ICANON;
+ cur_term->Nttyb.c_iflag |= ICRNL;
+ AFTER("nocbreak");
#else
- buf.sg_flags &= ~CBREAK;
+ cur_term->Nttyb.sg_flags &= ~CBREAK;
#endif
- if ((result = _nc_set_tty_mode(&buf)) == OK) {
- SP->_cbreak = 0;
- cur_term->Nttyb = buf;
- }
- AFTER("nocbreak");
- }
- returnCode(result);
+ returnCode(_nc_set_tty_mode(&cur_term->Nttyb));
}
-/*
- * Note:
- * this implementation may be wrong. See the comment under intrflush().
- */
NCURSES_EXPORT(void)
noqiflush(void)
{
- int result = ERR;
-
T((T_CALLED("noqiflush()")));
- if (cur_term != 0) {
- TTY buf;
+ /*
+ * Note: this implementation may be wrong. See the comment under
+ * intrflush().
+ */
- BEFORE("noqiflush");
- buf = cur_term->Nttyb;
#ifdef TERMIOS
- buf.c_lflag |= NOFLSH;
- result = _nc_set_tty_mode(&buf);
-#else
- /* FIXME */
+ BEFORE("noqiflush");
+ cur_term->Nttyb.c_lflag |= NOFLSH;
+ AFTER("noqiflush");
+ (void) _nc_set_tty_mode(&cur_term->Nttyb);
#endif
- if (result == OK) {
- cur_term->Nttyb = buf;
- }
- AFTER("noqiflush");
- }
returnVoid;
}
-/*
- * This call does the same thing as the qiflush()/noqiflush() pair. We know
- * for certain that SVr3 intrflush() tweaks the NOFLSH bit; on the other hand,
- * the match (in the SVr4 man pages) between the language describing NOFLSH in
- * termio(7) and the language describing qiflush()/noqiflush() in
- * curs_inopts(3x) is too exact to be coincidence.
- */
NCURSES_EXPORT(int)
intrflush(WINDOW *win GCC_UNUSED, bool flag)
{
- int result = ERR;
-
T((T_CALLED("intrflush(%d)"), flag));
- if (cur_term != 0) {
- TTY buf;
+ /*
+ * This call does the same thing as the qiflush()/noqiflush() pair. We
+ * know for certain that SVr3 intrflush() tweaks the NOFLSH bit; on the
+ * other hand, the match (in the SVr4 man pages) between the language
+ * describing NOFLSH in termio(7) and the language describing
+ * qiflush()/noqiflush() in curs_inopts(3x) is too exact to be coincidence.
+ */
- BEFORE("intrflush");
- buf = cur_term->Nttyb;
#ifdef TERMIOS
- if (flag)
- buf.c_lflag &= ~(NOFLSH);
- else
- buf.c_lflag |= (NOFLSH);
- result = _nc_set_tty_mode(&buf);
+ BEFORE("intrflush");
+ if (flag)
+ cur_term->Nttyb.c_lflag &= ~(NOFLSH);
+ else
+ cur_term->Nttyb.c_lflag |= (NOFLSH);
+ AFTER("intrflush");
+ returnCode(_nc_set_tty_mode(&cur_term->Nttyb));
#else
- /* FIXME */
+ returnCode(ERR);
#endif
- if (result == OK) {
- cur_term->Nttyb = buf;
- }
- AFTER("intrflush");
- }
- returnCode(result);
}
diff --git a/contrib/ncurses/ncurses/tinfo/lib_termcap.c b/contrib/ncurses/ncurses/tinfo/lib_termcap.c
index 33e15c5..911f89c 100644
--- a/contrib/ncurses/ncurses/tinfo/lib_termcap.c
+++ b/contrib/ncurses/ncurses/tinfo/lib_termcap.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2005,2006 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2001,2002 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 *
@@ -29,13 +29,13 @@
/****************************************************************************
* 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) *
- * (but it has changed a lot) *
****************************************************************************/
+/* $FreeBSD$ */
+
#define __INTERNAL_CAPS_VISIBLE
#include <curses.priv.h>
@@ -45,26 +45,72 @@
#include <term_entry.h>
-MODULE_ID("$Id: lib_termcap.c,v 1.58 2006/09/02 19:39:46 Miroslav.Lichvar Exp $")
+MODULE_ID("$Id: lib_termcap.c,v 1.43 2002/05/25 12:24:13 tom Exp $")
+
+#define CSI 233
+#define ESC 033 /* ^[ */
+#define L_BRACK '['
+#define SHIFT_OUT 017 /* ^N */
NCURSES_EXPORT_VAR(char *) UP = 0;
NCURSES_EXPORT_VAR(char *) BC = 0;
-typedef struct {
- long sequence;
- char *fix_sgr0; /* this holds the filtered sgr0 string */
- char *last_bufp; /* help with fix_sgr0 leak */
- TERMINAL *last_term;
-} CACHE;
+#ifdef FREEBSD_NATIVE
+#undef GCC_UNUSED
+#define GCC_UNUSED
+extern char _nc_termcap[]; /* buffer to copy out */
+#endif
+
+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;
+}
-#define MAX_CACHE 4
-static CACHE cache[MAX_CACHE];
-static int in_cache = 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;
+}
-#define FIX_SGR0 cache[in_cache].fix_sgr0
-#define LAST_TRM cache[in_cache].last_term
-#define LAST_BUF cache[in_cache].last_bufp
-#define LAST_SEQ cache[in_cache].sequence
+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;
+}
/***************************************************************************
*
@@ -82,64 +128,18 @@ static int in_cache = 0;
***************************************************************************/
NCURSES_EXPORT(int)
-tgetent(char *bufp, const char *name)
+tgetent(char *bufp GCC_UNUSED, const char *name)
{
- static long sequence;
-
int errcode;
- int n;
- bool found_cache = FALSE;
- START_TRACE();
T((T_CALLED("tgetent()")));
- _nc_setupterm((NCURSES_CONST char *) name, STDOUT_FILENO, &errcode, TRUE);
-
- /*
- * In general we cannot tell if the fixed sgr0 is still used by the
- * caller, but if tgetent() is called with the same buffer, that is
- * good enough, since the previous data would be invalidated by the
- * current call.
- */
- for (n = 0; n < MAX_CACHE; ++n) {
- bool same_result = (bufp != 0 && cache[n].last_bufp == bufp);
- if (same_result) {
- in_cache = n;
- if (FIX_SGR0 != 0) {
- FreeAndNull(FIX_SGR0);
- }
- /*
- * Also free the terminfo data that we loaded (much bigger leak).
- */
- if (LAST_TRM != 0 && LAST_TRM != cur_term) {
- TERMINAL *trm = LAST_TRM;
- del_curterm(LAST_TRM);
- for (in_cache = 0; in_cache < MAX_CACHE; ++in_cache)
- if (LAST_TRM == trm)
- LAST_TRM = 0;
- in_cache = n;
- }
- found_cache = TRUE;
- break;
- }
- }
- if (!found_cache) {
- int best = 0;
-
- for (in_cache = 0; in_cache < MAX_CACHE; ++in_cache) {
- if (LAST_SEQ < cache[best].sequence) {
- best = in_cache;
- }
- }
- in_cache = best;
- }
- LAST_TRM = cur_term;
- LAST_SEQ = ++sequence;
+ setupterm((NCURSES_CONST char *) name, STDOUT_FILENO, &errcode);
PC = 0;
UP = 0;
BC = 0;
- FIX_SGR0 = 0; /* don't free it - application may still use */
+ fix_me = 0;
if (errcode == 1) {
@@ -155,15 +155,67 @@ tgetent(char *bufp, const char *name)
if (backspace_if_not_bs != NULL)
BC = backspace_if_not_bs;
- if ((FIX_SGR0 = _nc_trim_sgr0(&(cur_term->type))) != 0) {
- if (!strcmp(FIX_SGR0, exit_attribute_mode)) {
- if (FIX_SGR0 != exit_attribute_mode) {
- free(FIX_SGR0);
+ /*
+ * 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"));
+ free(fix_me);
+ fix_me = 0;
}
- FIX_SGR0 = 0;
}
+ free(on);
}
- LAST_BUF = bufp;
(void) baudrate(); /* sets ospeed as a side-effect */
@@ -174,6 +226,16 @@ tgetent(char *bufp, const char *name)
#endif*/
}
+
+#ifdef FREEBSD_NATIVE
+ /*
+ * This is a REALLY UGLY hack. Basically, if we originate with
+ * a termcap source, try and copy it out.
+ */
+ if (bufp && _nc_termcap[0])
+ strncpy(bufp, _nc_termcap, 1024);
+#endif
+
returnCode(errcode);
}
@@ -189,7 +251,7 @@ tgetent(char *bufp, const char *name)
NCURSES_EXPORT(int)
tgetflag(NCURSES_CONST char *id)
{
- unsigned i;
+ int i;
T((T_CALLED("tgetflag(%s)"), id));
if (cur_term != 0) {
@@ -217,7 +279,7 @@ tgetflag(NCURSES_CONST char *id)
NCURSES_EXPORT(int)
tgetnum(NCURSES_CONST char *id)
{
- unsigned i;
+ int i;
T((T_CALLED("tgetnum(%s)"), id));
if (cur_term != 0) {
@@ -246,7 +308,7 @@ tgetnum(NCURSES_CONST char *id)
NCURSES_EXPORT(char *)
tgetstr(NCURSES_CONST char *id, char **area)
{
- unsigned i;
+ int i;
char *result = NULL;
T((T_CALLED("tgetstr(%s,%p)"), id, area));
@@ -260,14 +322,13 @@ tgetstr(NCURSES_CONST char *id, char **area)
/* setupterm forces canceled strings to null */
if (VALID_STRING(result)) {
if (result == exit_attribute_mode
- && FIX_SGR0 != 0) {
- result = FIX_SGR0;
+ && fix_me != 0) {
+ result = fix_me;
TR(TRACE_DATABASE, ("altered to : %s", _nc_visbuf(result)));
}
if (area != 0
&& *area != 0) {
(void) strcpy(*area, result);
- result = *area;
*area += strlen(*area) + 1;
}
}
@@ -277,14 +338,3 @@ tgetstr(NCURSES_CONST char *id, char **area)
}
returnPtr(result);
}
-
-#if NO_LEAKS
-NCURSES_EXPORT(void)
-_nc_tgetent_leaks(void)
-{
- for (in_cache = 0; in_cache < MAX_CACHE; ++in_cache) {
- FreeIfNeeded(FIX_SGR0);
- del_curterm(LAST_TRM);
- }
-}
-#endif
OpenPOWER on IntegriCloud