diff options
author | peter <peter@FreeBSD.org> | 2000-07-03 09:35:22 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 2000-07-03 09:35:22 +0000 |
commit | 1212bcc09f8e48235a83c65a1e350eaa0b3c5931 (patch) | |
tree | 97a2eb00ccb65ec54945bf2c7fc11b56ba33edf9 /contrib/ncurses | |
parent | 39a6db26dda039c9758aefecd1b0fb6b70fe87bf (diff) | |
download | FreeBSD-src-1212bcc09f8e48235a83c65a1e350eaa0b3c5931.zip FreeBSD-src-1212bcc09f8e48235a83c65a1e350eaa0b3c5931.tar.gz |
Merge vendor changes onto mainline
Diffstat (limited to 'contrib/ncurses')
-rw-r--r-- | contrib/ncurses/ncurses/tinfo/comp_scan.c | 908 | ||||
-rw-r--r-- | contrib/ncurses/ncurses/tinfo/lib_termcap.c | 148 |
2 files changed, 545 insertions, 511 deletions
diff --git a/contrib/ncurses/ncurses/tinfo/comp_scan.c b/contrib/ncurses/ncurses/tinfo/comp_scan.c index 39cf2cd..617ecc1 100644 --- a/contrib/ncurses/ncurses/tinfo/comp_scan.c +++ b/contrib/ncurses/ncurses/tinfo/comp_scan.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998 Free Software Foundation, Inc. * + * Copyright (c) 1998,1999,2000 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 * @@ -31,6 +31,8 @@ * and: Eric S. Raymond <esr@snark.thyrsus.com> * ****************************************************************************/ +/* $FreeBSD$ */ + /* * comp_scan.c --- Lexical scanner for terminfo compiler. * @@ -47,9 +49,10 @@ #include <curses.priv.h> #include <ctype.h> +#include <term_entry.h> #include <tic.h> -MODULE_ID("$Id: comp_scan.c,v 1.34 1998/11/01 00:56:39 tom Exp $") +MODULE_ID("$Id: comp_scan.c,v 1.44 2000/06/10 21:59:21 tom Exp $") /* * Maximum length of string capability we'll accept before raising an error. @@ -59,11 +62,14 @@ MODULE_ID("$Id: comp_scan.c,v 1.34 1998/11/01 00:56:39 tom Exp $") #define iswhite(ch) (ch == ' ' || ch == '\t') -int _nc_syntax; /* termcap or terminfo? */ -long _nc_curr_file_pos; /* file offset of current line */ -long _nc_comment_start; /* start of comment range before name */ -long _nc_comment_end; /* end of comment range before name */ -long _nc_start_line; /* start line of current entry */ +int _nc_syntax = 0; /* termcap or terminfo? */ +long _nc_curr_file_pos = 0; /* file offset of current line */ +long _nc_comment_start = 0; /* start of comment range before name */ +long _nc_comment_end = 0; /* end of comment range before name */ +long _nc_start_line = 0; /* start line of current entry */ + +struct token _nc_curr_token = +{0, 0, 0}; /***************************************************************************** * @@ -74,21 +80,22 @@ long _nc_start_line; /* start line of current entry */ static bool first_column; /* See 'next_char()' below */ static char separator; /* capability separator */ static int pushtype; /* type of pushback token */ -static char pushname[MAX_NAME_SIZE+1]; +static char pushname[MAX_NAME_SIZE + 1]; -static int last_char(void); -static int next_char(void); +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 inline int eat_escaped_newline(int ch) +static inline int +eat_escaped_newline(int ch) { - if (ch == '\\') - while ((ch = next_char()) == '\n' || iswhite(ch)) - continue; - return ch; + if (ch == '\\') + while ((ch = next_char()) == '\n' || iswhite(ch)) + continue; + return ch; } /* @@ -124,318 +131,308 @@ static inline int eat_escaped_newline(int ch) * */ -int _nc_get_token(void) +int +_nc_get_token(void) { -static const char terminfo_punct[] = "@%&*!#"; -long number; -int type; -int ch; -char * numchk; -char numbuf[80]; -unsigned found; -static char buffer[MAX_ENTRY_SIZE]; -char *ptr; -int dot_flag = FALSE; -long token_start; - - if (pushtype != NO_PUSHBACK) - { - int retval = pushtype; - - _nc_set_type(pushname); - DEBUG(3, ("pushed-back token: `%s', class %d", - _nc_curr_token.tk_name, pushtype)); - - pushtype = NO_PUSHBACK; - pushname[0] = '\0'; - - /* currtok wasn't altered by _nc_push_token() */ - return(retval); - } + static const char terminfo_punct[] = "@%&*!#"; + long number; + int type; + int ch; + char *numchk; + char numbuf[80]; + unsigned found; + static char buffer[MAX_ENTRY_SIZE]; + char *ptr; + int dot_flag = FALSE; + long token_start; + + if (pushtype != NO_PUSHBACK) { + int retval = pushtype; + + _nc_set_type(pushname); + DEBUG(3, ("pushed-back token: `%s', class %d", + _nc_curr_token.tk_name, pushtype)); - if (end_of_stream()) - return(EOF); + pushtype = NO_PUSHBACK; + pushname[0] = '\0'; -start_token: - token_start = stream_pos(); - while ((ch = next_char()) == '\n' || iswhite(ch)) - continue; + /* currtok wasn't altered by _nc_push_token() */ + return (retval); + } - ch = eat_escaped_newline(ch); + if (end_of_stream()) + return (EOF); - if (ch == EOF) - type = EOF; - else { - /* if this is a termcap entry, skip a leading separator */ - if (separator == ':' && ch == ':') - ch = next_char(); + start_token: + token_start = stream_pos(); + while ((ch = next_char()) == '\n' || iswhite(ch)) + continue; - if (ch == '.') { - dot_flag = TRUE; - DEBUG(8, ("dot-flag set")); + ch = eat_escaped_newline(ch); - while ((ch = next_char())=='.' || iswhite(ch)) - continue; - } + if (ch == EOF) + type = EOF; + else { + /* if this is a termcap entry, skip a leading separator */ + if (separator == ':' && ch == ':') + ch = next_char(); - if (ch == EOF) { - type = EOF; - goto end_of_token; - } + if (ch == '.' +#ifdef NCURSES_EXT_FUNCS + && !_nc_disable_period +#endif + ) { + dot_flag = TRUE; + DEBUG(8, ("dot-flag set")); - /* have to make some punctuation chars legal for terminfo */ - if (!isalnum(ch) && !strchr(terminfo_punct, (char)ch)) { - _nc_warning("Illegal character (expected alphanumeric or %s) - %s", - terminfo_punct, _tracechar((chtype)ch)); - _nc_panic_mode(separator); - goto start_token; - } + while ((ch = next_char()) == '.' || iswhite(ch)) + continue; + } - 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; - while ((ch = next_char()) != '\n') - { - if (ch == EOF) - _nc_err_abort("premature EOF"); - else if (ch == ':' && last_char() != ',') - { - _nc_syntax = SYN_TERMCAP; - separator = ':'; - break; - } - else if (ch == ',') - { - _nc_syntax = SYN_TERMINFO; - separator = ','; - /* - * 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); - - *ptr++ = ch; - } - ptr[0] = '\0'; - if (_nc_syntax == ERR) - { - /* - * Grrr...what we ought to do here is barf, - * complaining that the entry is malformed. - * But because a couple of name fields in the - * 8.2 termcap file end with |\, we just have - * to assume it's termcap syntax. - */ - _nc_syntax = SYN_TERMCAP; - separator = ':'; - } - else if (_nc_syntax == SYN_TERMINFO) - { - /* throw away trailing /, *$/ */ - for (--ptr; iswhite(*ptr) || *ptr == ','; ptr--) - continue; - ptr[1] = '\0'; - } + if (ch == EOF) { + type = EOF; + goto end_of_token; + } - /* - * This is the soonest we have the terminal name - * fetched. Set up for following warning messages. - */ - 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. - */ - desc = strrchr(buffer, '|'); - if (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"); + /* have to make some punctuation chars legal for terminfo */ + if (!isalnum(ch) +#ifdef NCURSES_EXT_FUNCS + && !(ch == '.' && _nc_disable_period) #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 (ptr = buffer; ptr < desc; ptr++) - { - if (isspace(*ptr)) - { - _nc_warning("whitespace in name or alias field"); - break; - } - else if (*ptr == '/') - { - _nc_warning("slashes aren't allowed in names or aliases"); - break; - } - else if (strchr("$[]!*?", *ptr)) - { - _nc_warning("dubious character `%c' in name or alias field", *ptr); - break; - } - } - - ptr = buffer; + && !strchr(terminfo_punct, (char) ch)) { + _nc_warning("Illegal character (expected alphanumeric or %s) - %s", + terminfo_punct, unctrl(ch)); + _nc_panic_mode(separator); + goto start_token; + } - _nc_curr_token.tk_name = buffer; - type = NAMES; - } else { - while ((ch = next_char()) != EOF) { - if (!isalnum(ch)) { - if (_nc_syntax == SYN_TERMINFO) { - if (ch != '_') - break; - } else { /* allow ';' for "k;" */ - if (ch != ';') - break; - } - } - *(ptr++) = ch; - } + ptr = buffer; + *(ptr++) = ch; - *ptr++ = '\0'; - switch (ch) { - case ',': - case ':': - if (ch != separator) - _nc_err_abort("Separator inconsistent with syntax"); - _nc_curr_token.tk_name = buffer; - type = BOOLEAN; - break; - case '@': - if ((ch = next_char()) != separator) - _nc_warning("Missing separator after `%s', have %s", - buffer, _tracechar((chtype)ch)); - _nc_curr_token.tk_name = buffer; - type = CANCEL; - break; - - case '#': - found = 0; - while (isalnum(ch = next_char())) { - numbuf[found++] = ch; - if (found >= sizeof(numbuf)-1) - break; - } - numbuf[found] = '\0'; - number = strtol(numbuf, &numchk, 0); - if (numchk == numbuf) - _nc_warning("no value given for `%s'", buffer); - if ((*numchk != '\0') || (ch != separator)) - _nc_warning("Missing separator"); - _nc_curr_token.tk_name = buffer; - _nc_curr_token.tk_valnumber = number; - type = NUMBER; - break; - - case '=': - ch = _nc_trans_string(ptr); - if (ch != separator) - _nc_warning("Missing separator"); - _nc_curr_token.tk_name = buffer; - _nc_curr_token.tk_valstring = ptr; - type = STRING; - break; - - case EOF: - type = EOF; - break; - default: - /* just to get rid of the compiler warning */ - type = UNDEF; - _nc_warning("Illegal character - %s", - _tracechar((chtype)ch)); - } - } /* end else (first_column == FALSE) */ - } /* end else (ch != EOF) */ + if (first_column) { + char *desc; -end_of_token: + _nc_comment_start = token_start; + _nc_comment_end = _nc_curr_file_pos; + _nc_start_line = _nc_curr_line; -#ifdef TRACE - if (dot_flag == TRUE) - DEBUG(8, ("Commented out ")); - - if (_nc_tracing & TRACE_IEVENT) - { - fprintf(stderr, "Token: "); - switch (type) - { - case BOOLEAN: - fprintf(stderr, "Boolean; name='%s'\n", - _nc_curr_token.tk_name); + _nc_syntax = ERR; + while ((ch = next_char()) != '\n') { + if (ch == EOF) + _nc_err_abort("premature EOF"); + else if (ch == ':' && last_char() != ',') { + _nc_syntax = SYN_TERMCAP; + separator = ':'; break; + } else if (ch == ',') { + _nc_syntax = SYN_TERMINFO; + separator = ','; + /* + * 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); + + *ptr++ = ch; + } + ptr[0] = '\0'; + if (_nc_syntax == ERR) { + /* + * Grrr...what we ought to do here is barf, + * complaining that the entry is malformed. + * But because a couple of name fields in the + * 8.2 termcap file end with |\, we just have + * to assume it's termcap syntax. + */ + _nc_syntax = SYN_TERMCAP; + separator = ':'; + } else if (_nc_syntax == SYN_TERMINFO) { + /* throw away trailing /, *$/ */ + for (--ptr; iswhite(*ptr) || *ptr == ','; ptr--) + continue; + ptr[1] = '\0'; + } - case NUMBER: - fprintf(stderr, "Number; name='%s', value=%d\n", - _nc_curr_token.tk_name, - _nc_curr_token.tk_valnumber); + /* + * This is the soonest we have the terminal name + * fetched. Set up for following warning messages. + */ + 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. + */ + desc = strrchr(buffer, '|'); + if (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 (ptr = buffer; ptr < desc; ptr++) { + if (isspace(*ptr)) { + _nc_warning("whitespace in name or alias field"); break; - - case STRING: - fprintf(stderr, "String; name='%s', value=%s\n", - _nc_curr_token.tk_name, - _nc_visbuf(_nc_curr_token.tk_valstring)); + } else if (*ptr == '/') { + _nc_warning("slashes aren't allowed in names or aliases"); break; - - case CANCEL: - fprintf(stderr, "Cancel; name='%s'\n", - _nc_curr_token.tk_name); + } else if (strchr("$[]!*?", *ptr)) { + _nc_warning("dubious character `%c' in name or alias field", *ptr); break; + } + } - case NAMES: + ptr = buffer; - fprintf(stderr, "Names; value='%s'\n", - _nc_curr_token.tk_name); - break; + _nc_curr_token.tk_name = buffer; + type = NAMES; + } else { + while ((ch = next_char()) != EOF) { + if (!isalnum(ch)) { + if (_nc_syntax == SYN_TERMINFO) { + if (ch != '_') + break; + } else { /* allow ';' for "k;" */ + if (ch != ';') + break; + } + } + *(ptr++) = ch; + } - case EOF: - fprintf(stderr, "End of file\n"); - break; + *ptr++ = '\0'; + switch (ch) { + case ',': + case ':': + if (ch != separator) + _nc_err_abort("Separator inconsistent with syntax"); + _nc_curr_token.tk_name = buffer; + type = BOOLEAN; + break; + case '@': + if ((ch = next_char()) != separator) + _nc_warning("Missing separator after `%s', have %s", + buffer, unctrl(ch)); + _nc_curr_token.tk_name = buffer; + type = CANCEL; + break; - default: - _nc_warning("Bad token type"); + case '#': + found = 0; + while (isalnum(ch = next_char())) { + numbuf[found++] = ch; + if (found >= sizeof(numbuf) - 1) + break; + } + numbuf[found] = '\0'; + number = strtol(numbuf, &numchk, 0); + if (numchk == numbuf) + _nc_warning("no value given for `%s'", buffer); + if ((*numchk != '\0') || (ch != separator)) + _nc_warning("Missing separator"); + _nc_curr_token.tk_name = buffer; + _nc_curr_token.tk_valnumber = number; + type = NUMBER; + break; + + case '=': + ch = _nc_trans_string(ptr, buffer + sizeof(buffer)); + if (ch != separator) + _nc_warning("Missing separator"); + _nc_curr_token.tk_name = buffer; + _nc_curr_token.tk_valstring = ptr; + type = STRING; + break; + + case EOF: + type = EOF; + break; + default: + /* just to get rid of the compiler warning */ + type = UNDEF; + _nc_warning("Illegal character - %s", unctrl(ch)); } + } /* end else (first_column == FALSE) */ + } /* end else (ch != EOF) */ + + end_of_token: + +#ifdef TRACE + if (dot_flag == TRUE) + DEBUG(8, ("Commented out ")); + + if (_nc_tracing >= DEBUG_LEVEL(7)) { + switch (type) { + case BOOLEAN: + _tracef("Token: Boolean; name='%s'", + _nc_curr_token.tk_name); + break; + + case NUMBER: + _tracef("Token: Number; name='%s', value=%d", + _nc_curr_token.tk_name, + _nc_curr_token.tk_valnumber); + break; + + case STRING: + _tracef("Token: String; name='%s', value=%s", + _nc_curr_token.tk_name, + _nc_visbuf(_nc_curr_token.tk_valstring)); + break; + + case CANCEL: + _tracef("Token: Cancel; name='%s'", + _nc_curr_token.tk_name); + break; + + case NAMES: + + _tracef("Token: Names; value='%s'", + _nc_curr_token.tk_name); + break; + + case EOF: + _tracef("Token: End of file"); + break; + + default: + _nc_warning("Bad token type"); } + } #endif - if (dot_flag == TRUE) /* if commented out, use the next one */ - type = _nc_get_token(); + if (dot_flag == TRUE) /* if commented out, use the next one */ + type = _nc_get_token(); - DEBUG(3, ("token: `%s', class %d", _nc_curr_token.tk_name, type)); + DEBUG(3, ("token: `%s', class %d", _nc_curr_token.tk_name, type)); - return(type); + return (type); } /* @@ -458,120 +455,150 @@ end_of_token: */ char -_nc_trans_string(char *ptr) +_nc_trans_string(char *ptr, char *last) { -int count = 0; -int number; -int i, c; -chtype ch, last_ch = '\0'; -bool ignored = FALSE; - - while ((ch = c = next_char()) != (chtype)separator && c != EOF) { - if ((_nc_syntax == SYN_TERMCAP) && c == '\n') - break; - if (ch == '^' && last_ch != '%') { - ch = c = next_char(); - if (c == EOF) - _nc_err_abort("Premature EOF"); - - if (! (is7bits(ch) && isprint(ch))) { - _nc_warning("Illegal ^ character - %s", - _tracechar((unsigned char)ch)); - } - if (ch == '?') { - *(ptr++) = '\177'; - } else { - if ((ch &= 037) == 0) - ch = 128; - *(ptr++) = (char)(ch); - } + int count = 0; + int number; + int i, c; + chtype ch, last_ch = '\0'; + bool ignored = FALSE; + bool long_warning = FALSE; + + while ((ch = c = next_char()) != (chtype) separator && c != EOF) { + if (ptr == (last - 1)) + break; + if ((_nc_syntax == SYN_TERMCAP) && c == '\n') + break; + if (ch == '^' && last_ch != '%') { + ch = c = next_char(); + if (c == EOF) + _nc_err_abort("Premature EOF"); + + if (!(is7bits(ch) && isprint(ch))) { + _nc_warning("Illegal ^ character - %s", unctrl(ch)); + } + if (ch == '?') { + *(ptr++) = '\177'; + if (_nc_tracing) + _nc_warning("Allow ^? as synonym for \\177"); + } else { + if ((ch &= 037) == 0) + ch = 128; + *(ptr++) = (char) (ch); } - else if (ch == '\\') { - ch = c = next_char(); - if (c == EOF) - _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("Premature EOF"); - - if (c < '0' || c > '7') { - if (isdigit(c)) { - _nc_warning("Non-octal digit `%c' in \\ sequence", c); - /* allow the digit; it'll do less harm */ - } else { - push_back((char)c); - break; - } + } else if (ch == '\\') { + ch = c = next_char(); + if (c == EOF) + _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("Premature EOF"); + + if (c < '0' || c > '7') { + if (isdigit(c)) { + _nc_warning("Non-octal digit `%c' in \\ sequence", c); + /* allow the digit; it'll do less harm */ + } else { + push_back((char) c); + break; } - - number = number * 8 + c - '0'; } - if (number == 0) - number = 0200; - *(ptr++) = (char) number; - } else { - switch (c) { - case 'E': - case 'e': *(ptr++) = '\033'; break; + number = number * 8 + c - '0'; + } + + if (number == 0) + number = 0200; + *(ptr++) = (char) number; + } else { + switch (c) { + case 'E': + case 'e': + *(ptr++) = '\033'; + break; - case 'a': *(ptr++) = '\007'; break; + case 'a': + *(ptr++) = '\007'; + break; - case 'l': - case 'n': *(ptr++) = '\n'; break; + case 'l': + case 'n': + *(ptr++) = '\n'; + break; - case 'r': *(ptr++) = '\r'; break; + case 'r': + *(ptr++) = '\r'; + break; - case 'b': *(ptr++) = '\010'; break; + case 'b': + *(ptr++) = '\010'; + break; - case 's': *(ptr++) = ' '; break; + case 's': + *(ptr++) = ' '; + break; - case 'f': *(ptr++) = '\014'; break; + case 'f': + *(ptr++) = '\014'; + break; - case 't': *(ptr++) = '\t'; break; + case 't': + *(ptr++) = '\t'; + break; - case '\\': *(ptr++) = '\\'; break; + case '\\': + *(ptr++) = '\\'; + break; - case '^': *(ptr++) = '^'; break; + case '^': + *(ptr++) = '^'; + break; - case ',': *(ptr++) = ','; break; + case ',': + *(ptr++) = ','; + break; - case ':': *(ptr++) = ':'; break; + case ':': + *(ptr++) = ':'; + break; - case '\n': - continue; + case '\n': + continue; - default: - _nc_warning("Illegal character %s in \\ sequence", - _tracechar((unsigned char)ch)); - *(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 */ - ignored = TRUE; - } else { - *(ptr++) = (char)ch; - } + default: + _nc_warning("Illegal character %s in \\ sequence", + unctrl(ch)); + *(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 */ + ignored = TRUE; + } else { + *(ptr++) = (char) ch; + } - if (!ignored) { - last_ch = ch; - count ++; - } - ignored = FALSE; + if (!ignored) { + last_ch = ch; + count++; + } + ignored = FALSE; - if (count > MAXCAPLEN) - _nc_warning("Very long string found. Missing separator?"); - } /* end while */ + if (count > MAXCAPLEN && !long_warning) { + _nc_warning("Very long string found. Missing separator?"); + long_warning = TRUE; + } + } /* end while */ - *ptr = '\0'; + *ptr = '\0'; - return(ch); + return (ch); } /* @@ -581,7 +608,8 @@ bool ignored = FALSE; * get_token() call. */ -void _nc_push_token(int tokclass) +void +_nc_push_token(int tokclass) { /* * This implementation is kind of bogus, it will fail if we ever do @@ -593,23 +621,24 @@ void _nc_push_token(int tokclass) _nc_get_type(pushname); DEBUG(3, ("pushing token: `%s', class %d", - _nc_curr_token.tk_name, pushtype)); + _nc_curr_token.tk_name, pushtype)); } /* * Panic mode error recovery - skip everything until a "ch" is found. */ -void _nc_panic_mode(char ch) +void +_nc_panic_mode(char ch) { - int c; - - for (;;) { - c = next_char(); - if (c == ch) - return; - if (c == EOF) - return; - } + int c; + + for (;;) { + c = next_char(); + if (c == ch) + return; + if (c == EOF) + return; + } } /***************************************************************************** @@ -632,16 +661,17 @@ static FILE *yyin; /* scanner's input file descriptor */ * non-null. */ -void _nc_reset_input(FILE *fp, char *buf) +void +_nc_reset_input(FILE * fp, char *buf) { - pushtype = NO_PUSHBACK; - pushname[0] = '\0'; - yyin = fp; - bufstart = bufptr = buf; - _nc_curr_file_pos = 0L; - if (fp != 0) - _nc_curr_line = 0; - _nc_curr_col = 0; + pushtype = NO_PUSHBACK; + pushname[0] = '\0'; + yyin = fp; + bufstart = bufptr = buf; + _nc_curr_file_pos = 0L; + if (fp != 0) + _nc_curr_line = 0; + _nc_curr_col = 0; } /* @@ -652,12 +682,12 @@ void _nc_reset_input(FILE *fp, char *buf) static int last_char(void) { - size_t len = strlen(bufptr); - while (len--) { - if (!isspace(bufptr[len])) - return bufptr[len]; - } - return 0; + size_t len = strlen(bufptr); + while (len--) { + if (!isspace(bufptr[len])) + return bufptr[len]; + } + return 0; } /* @@ -677,17 +707,14 @@ last_char(void) static int next_char(void) { - if (!yyin) - { + if (!yyin) { if (*bufptr == '\0') - return(EOF); + return (EOF); if (*bufptr == '\n') { _nc_curr_line++; _nc_curr_col = 0; } - } - else if (!bufptr || !*bufptr) - { + } 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 @@ -699,15 +726,15 @@ next_char(void) size_t len; do { - _nc_curr_file_pos = ftell(yyin); + _nc_curr_file_pos = ftell(yyin); - if ((bufstart = fgets(line, LEXBUFSIZ, yyin)) != NULL) { - _nc_curr_line++; - _nc_curr_col = 0; - } - bufptr = bufstart; - } while - (bufstart != NULL && line[0] == '#'); + if ((bufstart = fgets(line, LEXBUFSIZ, yyin)) != NULL) { + _nc_curr_line++; + _nc_curr_col = 0; + } + bufptr = bufstart; + } while + (bufstart != NULL && line[0] == '#'); if (bufstart == NULL) return (EOF); @@ -720,10 +747,10 @@ next_char(void) * files on OS/2, etc. */ if ((len = strlen(bufptr)) > 1) { - if (bufptr[len-1] == '\n' - && bufptr[len-2] == '\r') { - bufptr[len-2] = '\n'; - bufptr[len-1] = '\0'; + if (bufptr[len - 1] == '\n' + && bufptr[len - 2] == '\r') { + bufptr[len - 2] = '\n'; + bufptr[len - 1] = '\0'; } } } @@ -731,28 +758,31 @@ next_char(void) first_column = (bufptr == bufstart); _nc_curr_col++; - return(*bufptr++); + return (*bufptr++); } -static void push_back(char c) +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"); + _nc_syserr_abort("Can't backspace off beginning of line"); *--bufptr = c; } -static long stream_pos(void) +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) +static bool +end_of_stream(void) /* are we at end of input? */ { return ((yyin ? feof(yyin) : (bufptr && *bufptr == '\0')) - ? TRUE : FALSE); + ? TRUE : FALSE); } /* comp_scan.c ends here */ diff --git a/contrib/ncurses/ncurses/tinfo/lib_termcap.c b/contrib/ncurses/ncurses/tinfo/lib_termcap.c index b34ced5..fdfce05 100644 --- a/contrib/ncurses/ncurses/tinfo/lib_termcap.c +++ b/contrib/ncurses/ncurses/tinfo/lib_termcap.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998 Free Software Foundation, Inc. * + * Copyright (c) 1998,1999,2000 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 * @@ -41,15 +41,15 @@ #define __INTERNAL_CAPS_VISIBLE #include <term_entry.h> -MODULE_ID("$Id: lib_termcap.c,v 1.29 1999/09/05 01:06:43 tom Exp $") +MODULE_ID("$Id: lib_termcap.c,v 1.36 2000/02/13 01:01:26 tom Exp $") /* some of the code in here was contributed by: Magnus Bengtsson, d6mbeng@dtek.chalmers.se */ -char *UP; -char *BC; +char *UP = 0; +char *BC = 0; #ifdef FREEBSD_NATIVE #undef GCC_UNUSED @@ -72,29 +72,30 @@ extern char _nc_termcap[]; /* buffer to copy out */ * ***************************************************************************/ -int tgetent(char *bufp GCC_UNUSED, const char *name) +int +tgetent(char *bufp GCC_UNUSED, const char *name) { -int errcode; + int errcode; - T((T_CALLED("tgetent()"))); + T((T_CALLED("tgetent()"))); - setupterm((NCURSES_CONST char *)name, STDOUT_FILENO, &errcode); + setupterm((NCURSES_CONST char *) name, STDOUT_FILENO, &errcode); - if (errcode == 1) { + if (errcode == 1) { - if (cursor_left) - if ((backspaces_with_bs = !strcmp(cursor_left, "\b")) == 0) - backspace_if_not_bs = cursor_left; + if (cursor_left) + if ((backspaces_with_bs = !strcmp(cursor_left, "\b")) == 0) + backspace_if_not_bs = cursor_left; - /* we're required to export these */ - if (pad_char != NULL) - PC = pad_char[0]; - if (cursor_up != NULL) - UP = cursor_up; - if (backspace_if_not_bs != NULL) - BC = backspace_if_not_bs; + /* we're required to export these */ + if (pad_char != NULL) + PC = pad_char[0]; + if (cursor_up != NULL) + UP = cursor_up; + if (backspace_if_not_bs != NULL) + BC = backspace_if_not_bs; - (void) baudrate(); /* sets ospeed as a side-effect */ + (void) baudrate(); /* sets ospeed as a side-effect */ /* LINT_PREPRO #if 0*/ @@ -102,7 +103,6 @@ int errcode; /* LINT_PREPRO #endif*/ - } #ifdef FREEBSD_NATIVE /* * This is a REALLY UGLY hack. Basically, if we originate with @@ -112,7 +112,8 @@ int errcode; strncpy(bufp, _nc_termcap, 1024); #endif - returnCode(errcode); + } + returnCode(errcode); } /*************************************************************************** @@ -124,22 +125,23 @@ int errcode; * ***************************************************************************/ -int tgetflag(NCURSES_CONST char *id) +int +tgetflag(NCURSES_CONST char *id) { -int i; - - T((T_CALLED("tgetflag(%s)"), id)); - if (cur_term != 0) { - TERMTYPE *tp = &(cur_term->type); - for_each_boolean(i, tp) { - const char *capname = ExtBoolname(tp, i, boolcodes); - if (!strncmp(id, capname, 2)) { - /* setupterm forces invalid booleans to false */ - returnCode(tp->Booleans[i]); - } + int i; + + T((T_CALLED("tgetflag(%s)"), id)); + if (cur_term != 0) { + TERMTYPE *tp = &(cur_term->type); + for_each_boolean(i, tp) { + const char *capname = ExtBoolname(tp, i, boolcodes); + if (!strncmp(id, capname, 2)) { + /* setupterm forces invalid booleans to false */ + returnCode(tp->Booleans[i]); } } - returnCode(0); /* Solaris does this */ + } + returnCode(0); /* Solaris does this */ } /*************************************************************************** @@ -151,23 +153,24 @@ int i; * ***************************************************************************/ -int tgetnum(NCURSES_CONST char *id) +int +tgetnum(NCURSES_CONST char *id) { -int i; - - T((T_CALLED("tgetnum(%s)"), id)); - if (cur_term != 0) { - TERMTYPE *tp = &(cur_term->type); - for_each_number(i, tp) { - const char *capname = ExtNumname(tp, i, numcodes); - if (!strncmp(id, capname, 2)) { - if (!VALID_NUMERIC(tp->Numbers[i])) - return -1; - returnCode(tp->Numbers[i]); - } + int i; + + T((T_CALLED("tgetnum(%s)"), id)); + if (cur_term != 0) { + TERMTYPE *tp = &(cur_term->type); + for_each_number(i, tp) { + const char *capname = ExtNumname(tp, i, numcodes); + if (!strncmp(id, capname, 2)) { + if (!VALID_NUMERIC(tp->Numbers[i])) + returnCode(ABSENT_NUMERIC); + returnCode(tp->Numbers[i]); } } - returnCode(ERR); + } + returnCode(ABSENT_NUMERIC); } /*************************************************************************** @@ -179,30 +182,30 @@ int i; * ***************************************************************************/ -char *tgetstr(NCURSES_CONST char *id, char **area) +char * +tgetstr(NCURSES_CONST char *id, char **area) { -int i; - - T((T_CALLED("tgetstr(%s,%p)"), id, area)); - if (cur_term != 0) { - TERMTYPE *tp = &(cur_term->type); - for_each_string(i, tp) { - const char *capname = ExtStrname(tp, i, strcodes); - T(("trying %s", capname)); - if (!strncmp(id, capname, 2)) { - T(("found match : %s", _nc_visbuf(tp->Strings[i]))); - /* setupterm forces cancelled strings to null */ - if (area != 0 - && *area != 0 - && VALID_STRING(tp->Strings[i])) { - (void) strcpy(*area, tp->Strings[i]); - *area += strlen(*area) + 1; - } - returnPtr(tp->Strings[i]); + int i; + + T((T_CALLED("tgetstr(%s,%p)"), id, area)); + if (cur_term != 0) { + TERMTYPE *tp = &(cur_term->type); + for_each_string(i, tp) { + const char *capname = ExtStrname(tp, i, strcodes); + if (!strncmp(id, capname, 2)) { + TR(TRACE_DATABASE,("found match : %s", _nc_visbuf(tp->Strings[i]))); + /* setupterm forces canceled strings to null */ + if (area != 0 + && *area != 0 + && VALID_STRING(tp->Strings[i])) { + (void) strcpy(*area, tp->Strings[i]); + *area += strlen(*area) + 1; } + returnPtr(tp->Strings[i]); } } - returnPtr(NULL); + } + returnPtr(NULL); } /* @@ -214,8 +217,9 @@ int i; * */ -char *tgoto(const char *string, int x, int y) +char * +tgoto(const char *string, int x, int y) { - T((T_CALLED("tgoto(%s,%d,%d)"), string, x, y)); - returnPtr(tparm((NCURSES_CONST char *)string, y, x)); + T((T_CALLED("tgoto(%s,%d,%d)"), string, x, y)); + returnPtr(tparm((NCURSES_CONST char *) string, y, x)); } |