ncurses 5.7 - patch 20090411
[ncurses.git] / ncurses / tinfo / parse_entry.c
index 578e86eec2401b588d53d6854b26718a298ded5c..cf7a5f409d7c372dc689e3abf9d4a843c7d6553f 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2002,2003 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2007,2008 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,7 +29,7 @@
 /****************************************************************************
  *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
  *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
- *     and: Thomas E. Dickey                        1996-2003               *
+ *     and: Thomas E. Dickey                        1996-on                 *
  ****************************************************************************/
 
 /*
@@ -48,7 +48,7 @@
 #include <tic.h>
 #include <term_entry.h>
 
-MODULE_ID("$Id: parse_entry.c,v 1.60 2003/11/08 21:57:09 tom Exp $")
+MODULE_ID("$Id: parse_entry.c,v 1.69 2008/08/16 21:52:03 tom Exp $")
 
 #ifdef LINT
 static short const parametrized[] =
@@ -142,7 +142,7 @@ _nc_extend_names(ENTRY * entryp, char *name, int token_type)
        case BOOLEAN:
            tp->ext_Booleans += 1;
            tp->num_Booleans += 1;
-           tp->Booleans = typeRealloc(char, tp->num_Booleans, tp->Booleans);
+           tp->Booleans = typeRealloc(NCURSES_SBOOL, tp->num_Booleans, tp->Booleans);
            for (last = tp->num_Booleans - 1; last > tindex; last--)
                tp->Booleans[last] = tp->Booleans[last - 1];
            break;
@@ -232,7 +232,11 @@ _nc_parse_entry(struct entry *entryp, int literal, bool silent)
      * 2-character name, but was instead the first alias after that.
      */
     ptr = _nc_curr_token.tk_name;
-    if (_nc_syntax == SYN_TERMCAP) {
+    if (_nc_syntax == SYN_TERMCAP
+#if NCURSES_XNAMES
+       && !_nc_user_definable
+#endif
+       ) {
        if (ptr[2] == '|') {
            ptr += 3;
            _nc_curr_token.tk_name[2] = '\0';
@@ -241,6 +245,9 @@ _nc_parse_entry(struct entry *entryp, int literal, bool silent)
 
     entryp->tterm.str_table = entryp->tterm.term_names = _nc_save_str(ptr);
 
+    if (entryp->tterm.str_table == 0)
+       return (ERR);
+
     DEBUG(1, ("Starting '%s'", ptr));
 
     /*
@@ -279,7 +286,7 @@ _nc_parse_entry(struct entry *entryp, int literal, bool silent)
        } else {
            /* normal token lookup */
            entry_ptr = _nc_find_entry(_nc_curr_token.tk_name,
-                                      _nc_syntax ? _nc_cap_hash_table : _nc_info_hash_table);
+                                      _nc_get_hash_table(_nc_syntax));
 
            /*
             * Our kluge to handle aliasing.  The reason it's done
@@ -296,7 +303,7 @@ _nc_parse_entry(struct entry *entryp, int literal, bool silent)
                    if (entryp->nuses != 0) {
                        BAD_TC_USAGE
                    }
-                   for (ap = _nc_capalias_table; ap->from; ap++)
+                   for (ap = _nc_get_alias_table(TRUE); ap->from; ap++)
                        if (strcmp(ap->from, _nc_curr_token.tk_name) == 0) {
                            if (ap->to == (char *) 0) {
                                _nc_warning("%s (%s termcap extension) ignored",
@@ -304,14 +311,15 @@ _nc_parse_entry(struct entry *entryp, int literal, bool silent)
                                goto nexttok;
                            }
 
-                           entry_ptr = _nc_find_entry(ap->to, _nc_cap_hash_table);
+                           entry_ptr = _nc_find_entry(ap->to,
+                                                      _nc_get_hash_table(TRUE));
                            if (entry_ptr && !silent)
                                _nc_warning("%s (%s termcap extension) aliased to %s",
                                            ap->from, ap->source, ap->to);
                            break;
                        }
                } else {        /* if (_nc_syntax == SYN_TERMINFO) */
-                   for (ap = _nc_infoalias_table; ap->from; ap++)
+                   for (ap = _nc_get_alias_table(FALSE); ap->from; ap++)
                        if (strcmp(ap->from, _nc_curr_token.tk_name) == 0) {
                            if (ap->to == (char *) 0) {
                                _nc_warning("%s (%s terminfo extension) ignored",
@@ -319,7 +327,8 @@ _nc_parse_entry(struct entry *entryp, int literal, bool silent)
                                goto nexttok;
                            }
 
-                           entry_ptr = _nc_find_entry(ap->to, _nc_info_hash_table);
+                           entry_ptr = _nc_find_entry(ap->to,
+                                                      _nc_get_hash_table(FALSE));
                            if (entry_ptr && !silent)
                                _nc_warning("%s (%s terminfo extension) aliased to %s",
                                            ap->from, ap->source, ap->to);
@@ -366,23 +375,28 @@ _nc_parse_entry(struct entry *entryp, int literal, bool silent)
                 * type, this will do the job.
                 */
 
-               /* tell max_attributes from arrow_key_map */
-               if (token_type == NUMBER && !strcmp("ma", _nc_curr_token.tk_name))
+               if (token_type == NUMBER
+                   && !strcmp("ma", _nc_curr_token.tk_name)) {
+                   /* tell max_attributes from arrow_key_map */
                    entry_ptr = _nc_find_type_entry("ma", NUMBER,
                                                    _nc_get_table(_nc_syntax
                                                                  != 0));
+                   assert(entry_ptr != 0);
 
-               /* map terminfo's string MT to MT */
-               else if (token_type == STRING && !strcmp("MT", _nc_curr_token.tk_name))
+               } else if (token_type == STRING
+                          && !strcmp("MT", _nc_curr_token.tk_name)) {
+                   /* map terminfo's string MT to MT */
                    entry_ptr = _nc_find_type_entry("MT", STRING,
                                                    _nc_get_table(_nc_syntax
                                                                  != 0));
+                   assert(entry_ptr != 0);
 
-               /* treat strings without following "=" as empty strings */
-               else if (token_type == BOOLEAN && entry_ptr->nte_type == STRING)
+               } else if (token_type == BOOLEAN
+                          && entry_ptr->nte_type == STRING) {
+                   /* treat strings without following "=" as empty strings */
                    token_type = STRING;
-               /* we couldn't recover; skip this token */
-               else {
+               } else {
+                   /* we couldn't recover; skip this token */
                    if (!silent) {
                        const char *type_name;
                        switch (entry_ptr->nte_type) {
@@ -445,7 +459,7 @@ _nc_parse_entry(struct entry *entryp, int literal, bool silent)
            default:
                if (!silent)
                    _nc_warning("unknown token type");
-               _nc_panic_mode((_nc_syntax == SYN_TERMCAP) ? ':' : ',');
+               _nc_panic_mode((char) ((_nc_syntax == SYN_TERMCAP) ? ':' : ','));
                continue;
            }
        }                       /* end else cur_token.name != "use" */
@@ -465,7 +479,7 @@ _nc_parse_entry(struct entry *entryp, int literal, bool silent)
     if (!literal) {
        if (_nc_syntax == SYN_TERMCAP) {
            bool has_base_entry = FALSE;
-           int i;
+           unsigned i;
 
            /*
             * Don't insert defaults if this is a `+' entry meant only
@@ -540,8 +554,8 @@ append_acs0(string_desc * dst, int code, int src)
 {
     if (src != 0) {
        char temp[3];
-       temp[0] = code;
-       temp[1] = src;
+       temp[0] = (char) code;
+       temp[1] = (char) src;
        temp[2] = 0;
        _nc_safe_strcat(dst, temp);
     }
@@ -616,7 +630,7 @@ static const char C_HT[] = "\t";
 #define CUR tp->
 
 static void
-postprocess_termcap(TERMTYPE * tp, bool has_base)
+postprocess_termcap(TERMTYPE *tp, bool has_base)
 {
     char buf[MAX_LINE * 2 + 2];
     string_desc result;
@@ -776,11 +790,12 @@ postprocess_termcap(TERMTYPE * tp, bool has_base)
             base = cp + 1) {
            size_t len = cp - base;
 
-           for (ap = ko_xlate; ap->from; ap++)
+           for (ap = ko_xlate; ap->from; ap++) {
                if (len == strlen(ap->from)
                    && strncmp(ap->from, base, len) == 0)
                    break;
-           if (!ap->to) {
+           }
+           if (!(ap->from && ap->to)) {
                _nc_warning("unknown capability `%.*s' in ko string",
                            (int) len, base);
                continue;
@@ -789,8 +804,8 @@ postprocess_termcap(TERMTYPE * tp, bool has_base)
 
            /* now we know we found a match in ko_table, so... */
 
-           from_ptr = _nc_find_entry(ap->from, _nc_cap_hash_table);
-           to_ptr = _nc_find_entry(ap->to, _nc_info_hash_table);
+           from_ptr = _nc_find_entry(ap->from, _nc_get_hash_table(TRUE));
+           to_ptr = _nc_find_entry(ap->to, _nc_get_hash_table(FALSE));
 
            if (!from_ptr || !to_ptr)   /* should never happen! */
                _nc_err_abort("ko translation table is invalid, I give up");
@@ -896,7 +911,7 @@ postprocess_termcap(TERMTYPE * tp, bool has_base)
 }
 
 static void
-postprocess_terminfo(TERMTYPE * tp)
+postprocess_terminfo(TERMTYPE *tp)
 {
     /*
      * TERMINFO-TO-TERMINFO MAPPINGS FOR SOURCE TRANSLATION