diff options
Diffstat (limited to 'contrib/ncurses')
-rw-r--r-- | contrib/ncurses/ncurses/tinfo/comp_scan.c | 530 | ||||
-rw-r--r-- | contrib/ncurses/ncurses/tinfo/lib_baudrate.c | 4 | ||||
-rw-r--r-- | contrib/ncurses/ncurses/tinfo/lib_raw.c | 228 | ||||
-rw-r--r-- | contrib/ncurses/ncurses/tinfo/lib_termcap.c | 228 |
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 |