]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - ncurses/tinfo/parse_entry.c
ncurses 6.1 - patch 20190810
[ncurses.git] / ncurses / tinfo / parse_entry.c
index bbbfcb270ac424e7f697a79d85c887ee9fc05ece..f8cca8b5747824f6a551c0b4d92a46b08757bf7c 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
 /****************************************************************************
- * Copyright (c) 1998-2016,2017 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2018,2019 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            *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
@@ -47,7 +47,7 @@
 #include <ctype.h>
 #include <tic.h>
 
 #include <ctype.h>
 #include <tic.h>
 
-MODULE_ID("$Id: parse_entry.c,v 1.91 2017/08/26 16:13:34 tom Exp $")
+MODULE_ID("$Id: parse_entry.c,v 1.97 2019/08/03 23:10:38 tom Exp $")
 
 #ifdef LINT
 static short const parametrized[] =
 
 #ifdef LINT
 static short const parametrized[] =
@@ -63,7 +63,7 @@ static struct name_table_entry const *lookup_fullname(const char *name);
 #if NCURSES_XNAMES
 
 static struct name_table_entry const *
 #if NCURSES_XNAMES
 
 static struct name_table_entry const *
-_nc_extend_names(ENTRY * entryp, char *name, int token_type)
+_nc_extend_names(ENTRY * entryp, const char *name, int token_type)
 {
     static struct name_table_entry temp;
     TERMTYPE2 *tp = &(entryp->tterm);
 {
     static struct name_table_entry temp;
     TERMTYPE2 *tp = &(entryp->tterm);
@@ -178,6 +178,39 @@ _nc_extend_names(ENTRY * entryp, char *name, int token_type)
 
     return &temp;
 }
 
     return &temp;
 }
+
+static const char *
+usertype2s(int mask)
+{
+    const char *result = "unknown";
+    if (mask & (1 << BOOLEAN)) {
+       result = "boolean";
+    } else if (mask & (1 << NUMBER)) {
+       result = "number";
+    } else if (mask & (1 << STRING)) {
+       result = "string";
+    }
+    return result;
+}
+
+static bool
+expected_type(const char *name, int token_type, bool silent)
+{
+    struct user_table_entry const *entry = _nc_find_user_entry(name);
+    bool result = TRUE;
+    if ((entry != 0) && (token_type != CANCEL)) {
+       int have_type = (1 << token_type);
+       if (!(entry->ute_type & have_type)) {
+           if (!silent)
+               _nc_warning("expected %s-type for %s, have %s",
+                           usertype2s(entry->ute_type),
+                           name,
+                           usertype2s(have_type));
+           result = FALSE;
+       }
+    }
+    return result;
+}
 #endif /* NCURSES_XNAMES */
 
 static bool
 #endif /* NCURSES_XNAMES */
 
 static bool
@@ -217,7 +250,7 @@ valid_entryname(const char *name)
        { bad_tc_usage = TRUE; \
         _nc_warning("Legacy termcap allows only a trailing tc= clause"); }
 
        { bad_tc_usage = TRUE; \
         _nc_warning("Legacy termcap allows only a trailing tc= clause"); }
 
-#define MAX_NUMBER 0x7fff      /* positive shorts only */
+#define MAX_NUMBER MAX_OF_TYPE(NCURSES_INT2)
 
 NCURSES_EXPORT(int)
 _nc_parse_entry(ENTRY * entryp, int literal, bool silent)
 
 NCURSES_EXPORT(int)
 _nc_parse_entry(ENTRY * entryp, int literal, bool silent)
@@ -385,12 +418,20 @@ _nc_parse_entry(ENTRY * entryp, int literal, bool silent)
             * define a name based on its context.
             */
            if (entry_ptr == NOTFOUND
             * define a name based on its context.
             */
            if (entry_ptr == NOTFOUND
-               && _nc_user_definable
-               && (entry_ptr = _nc_extend_names(entryp,
-                                                _nc_curr_token.tk_name,
-                                                token_type)) != 0) {
-               if (_nc_tracing >= DEBUG_LEVEL(1))
-                   _nc_warning("extended capability '%s'", _nc_curr_token.tk_name);
+               && _nc_user_definable) {
+               if (expected_type(_nc_curr_token.tk_name, token_type, silent)) {
+                   if ((entry_ptr = _nc_extend_names(entryp,
+                                                     _nc_curr_token.tk_name,
+                                                     token_type)) != 0) {
+                       if (_nc_tracing >= DEBUG_LEVEL(1)) {
+                           _nc_warning("extended capability '%s'",
+                                       _nc_curr_token.tk_name);
+                       }
+                   }
+               } else {
+                   /* ignore it: we have already printed error message */
+                   continue;
+               }
            }
 #endif /* NCURSES_XNAMES */
 
            }
 #endif /* NCURSES_XNAMES */
 
@@ -489,11 +530,14 @@ _nc_parse_entry(ENTRY * entryp, int literal, bool silent)
                break;
 
            case NUMBER:
                break;
 
            case NUMBER:
+#if !NCURSES_EXT_NUMBERS
                if (_nc_curr_token.tk_valnumber > MAX_NUMBER) {
                    entryp->tterm.Numbers[entry_ptr->nte_index] = MAX_NUMBER;
                if (_nc_curr_token.tk_valnumber > MAX_NUMBER) {
                    entryp->tterm.Numbers[entry_ptr->nte_index] = MAX_NUMBER;
-               } else {
+               } else
+#endif
+               {
                    entryp->tterm.Numbers[entry_ptr->nte_index] =
                    entryp->tterm.Numbers[entry_ptr->nte_index] =
-                       (short) _nc_curr_token.tk_valnumber;
+                       (NCURSES_INT2) _nc_curr_token.tk_valnumber;
                }
                break;
 
                }
                break;
 
@@ -543,9 +587,11 @@ _nc_parse_entry(ENTRY * entryp, int literal, bool silent)
                 * Otherwise, look for a base entry that will already
                 * have picked up defaults via translation.
                 */
                 * Otherwise, look for a base entry that will already
                 * have picked up defaults via translation.
                 */
-               for (i = 0; i < entryp->nuses; i++)
-                   if (!strchr((char *) entryp->uses[i].name, '+'))
+               for (i = 0; i < entryp->nuses; i++) {
+                   if (entryp->uses[i].name != 0
+                       && !strchr(entryp->uses[i].name, '+'))
                        has_base_entry = TRUE;
                        has_base_entry = TRUE;
+               }
            }
 
            postprocess_termcap(&entryp->tterm, has_base_entry);
            }
 
            postprocess_termcap(&entryp->tterm, has_base_entry);