ncurses 5.9 - patch 20130713
[ncurses.git] / ncurses / tinfo / parse_entry.c
index cfa7b356eebaea04a8b203f2621a7806186dc22a..2936a64369a884dfc8abf8777ef3454856cacf36 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
 /****************************************************************************
- * Copyright (c) 1998-2008,2009 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2011,2012 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            *
@@ -46,9 +46,8 @@
 
 #include <ctype.h>
 #include <tic.h>
 
 #include <ctype.h>
 #include <tic.h>
-#include <term_entry.h>
 
 
-MODULE_ID("$Id: parse_entry.c,v 1.70 2009/04/18 21:01:38 tom Exp $")
+MODULE_ID("$Id: parse_entry.c,v 1.79 2012/10/27 21:43:45 tom Exp $")
 
 #ifdef LINT
 static short const parametrized[] =
 
 #ifdef LINT
 static short const parametrized[] =
@@ -146,27 +145,27 @@ _nc_extend_names(ENTRY * entryp, char *name, int token_type)
        case BOOLEAN:
            tp->ext_Booleans++;
            tp->num_Booleans++;
        case BOOLEAN:
            tp->ext_Booleans++;
            tp->num_Booleans++;
-           tp->Booleans = typeRealloc(NCURSES_SBOOL, tp->num_Booleans, tp->Booleans);
+           TYPE_REALLOC(NCURSES_SBOOL, tp->num_Booleans, tp->Booleans);
            for_each_value(tp->num_Booleans)
                tp->Booleans[last] = tp->Booleans[last - 1];
            break;
        case NUMBER:
            tp->ext_Numbers++;
            tp->num_Numbers++;
            for_each_value(tp->num_Booleans)
                tp->Booleans[last] = tp->Booleans[last - 1];
            break;
        case NUMBER:
            tp->ext_Numbers++;
            tp->num_Numbers++;
-           tp->Numbers = typeRealloc(short, tp->num_Numbers, tp->Numbers);
+           TYPE_REALLOC(short, tp->num_Numbers, tp->Numbers);
            for_each_value(tp->num_Numbers)
                tp->Numbers[last] = tp->Numbers[last - 1];
            break;
        case STRING:
            tp->ext_Strings++;
            tp->num_Strings++;
            for_each_value(tp->num_Numbers)
                tp->Numbers[last] = tp->Numbers[last - 1];
            break;
        case STRING:
            tp->ext_Strings++;
            tp->num_Strings++;
-           tp->Strings = typeRealloc(char *, tp->num_Strings, tp->Strings);
+           TYPE_REALLOC(char *, tp->num_Strings, tp->Strings);
            for_each_value(tp->num_Strings)
                tp->Strings[last] = tp->Strings[last - 1];
            break;
        }
        actual = NUM_EXT_NAMES(tp);
            for_each_value(tp->num_Strings)
                tp->Strings[last] = tp->Strings[last - 1];
            break;
        }
        actual = NUM_EXT_NAMES(tp);
-       tp->ext_Names = typeRealloc(char *, actual, tp->ext_Names);
+       TYPE_REALLOC(char *, actual, tp->ext_Names);
        while (--actual > offset)
            tp->ext_Names[actual] = tp->ext_Names[actual - 1];
        tp->ext_Names[offset] = _nc_save_str(name);
        while (--actual > offset)
            tp->ext_Names[actual] = tp->ext_Names[actual - 1];
        tp->ext_Names[offset] = _nc_save_str(name);
@@ -204,6 +203,8 @@ _nc_extend_names(ENTRY * entryp, char *name, int token_type)
        { 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 */
+
 NCURSES_EXPORT(int)
 _nc_parse_entry(struct entry *entryp, int literal, bool silent)
 {
 NCURSES_EXPORT(int)
 _nc_parse_entry(struct entry *entryp, int literal, bool silent)
 {
@@ -383,16 +384,14 @@ _nc_parse_entry(struct entry *entryp, int literal, bool silent)
                    && !strcmp("ma", _nc_curr_token.tk_name)) {
                    /* tell max_attributes from arrow_key_map */
                    entry_ptr = _nc_find_type_entry("ma", 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));
+                                                   _nc_syntax != 0);
                    assert(entry_ptr != 0);
 
                } 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,
                    assert(entry_ptr != 0);
 
                } 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));
+                                                   _nc_syntax != 0);
                    assert(entry_ptr != 0);
 
                } else if (token_type == BOOLEAN
                    assert(entry_ptr != 0);
 
                } else if (token_type == BOOLEAN
@@ -447,8 +446,12 @@ _nc_parse_entry(struct entry *entryp, int literal, bool silent)
                break;
 
            case NUMBER:
                break;
 
            case NUMBER:
-               entryp->tterm.Numbers[entry_ptr->nte_index] =
-                   (short) _nc_curr_token.tk_valnumber;
+               if (_nc_curr_token.tk_valnumber > MAX_NUMBER) {
+                   entryp->tterm.Numbers[entry_ptr->nte_index] = MAX_NUMBER;
+               } else {
+                   entryp->tterm.Numbers[entry_ptr->nte_index] =
+                       (short) _nc_curr_token.tk_valnumber;
+               }
                break;
 
            case STRING:
                break;
 
            case STRING:
@@ -514,9 +517,9 @@ NCURSES_EXPORT(int)
 _nc_capcmp(const char *s, const char *t)
 /* compare two string capabilities, stripping out padding */
 {
 _nc_capcmp(const char *s, const char *t)
 /* compare two string capabilities, stripping out padding */
 {
-    if (!s && !t)
+    if (!VALID_STRING(s) && !VALID_STRING(t))
        return (0);
        return (0);
-    else if (!s || !t)
+    else if (!VALID_STRING(s) || !VALID_STRING(t))
        return (1);
 
     for (;;) {
        return (1);
 
     for (;;) {
@@ -657,27 +660,30 @@ postprocess_termcap(TERMTYPE *tp, bool has_base)
 
        if (WANTED(carriage_return)) {
            if (carriage_return_delay > 0) {
 
        if (WANTED(carriage_return)) {
            if (carriage_return_delay > 0) {
-               sprintf(buf, "%s$<%d>", C_CR, carriage_return_delay);
+               _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+                           "%s$<%d>", C_CR, carriage_return_delay);
                carriage_return = _nc_save_str(buf);
            } else
                carriage_return = _nc_save_str(C_CR);
        }
        if (WANTED(cursor_left)) {
            if (backspace_delay > 0) {
                carriage_return = _nc_save_str(buf);
            } else
                carriage_return = _nc_save_str(C_CR);
        }
        if (WANTED(cursor_left)) {
            if (backspace_delay > 0) {
-               sprintf(buf, "%s$<%d>", C_BS, backspace_delay);
+               _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+                           "%s$<%d>", C_BS, backspace_delay);
                cursor_left = _nc_save_str(buf);
            } else if (backspaces_with_bs == 1)
                cursor_left = _nc_save_str(C_BS);
            else if (PRESENT(backspace_if_not_bs))
                cursor_left = backspace_if_not_bs;
        }
                cursor_left = _nc_save_str(buf);
            } else if (backspaces_with_bs == 1)
                cursor_left = _nc_save_str(C_BS);
            else if (PRESENT(backspace_if_not_bs))
                cursor_left = backspace_if_not_bs;
        }
-       /* vi doesn't use "do", but it does seems to use nl (or '\n') instead */
+       /* vi doesn't use "do", but it does seem to use nl (or '\n') instead */
        if (WANTED(cursor_down)) {
            if (PRESENT(linefeed_if_not_lf))
                cursor_down = linefeed_if_not_lf;
            else if (linefeed_is_newline != 1) {
                if (new_line_delay > 0) {
        if (WANTED(cursor_down)) {
            if (PRESENT(linefeed_if_not_lf))
                cursor_down = linefeed_if_not_lf;
            else if (linefeed_is_newline != 1) {
                if (new_line_delay > 0) {
-                   sprintf(buf, "%s$<%d>", C_LF, new_line_delay);
+                   _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+                               "%s$<%d>", C_LF, new_line_delay);
                    cursor_down = _nc_save_str(buf);
                } else
                    cursor_down = _nc_save_str(C_LF);
                    cursor_down = _nc_save_str(buf);
                } else
                    cursor_down = _nc_save_str(C_LF);
@@ -688,7 +694,8 @@ postprocess_termcap(TERMTYPE *tp, bool has_base)
                cursor_down = linefeed_if_not_lf;
            else if (linefeed_is_newline != 1) {
                if (new_line_delay > 0) {
                cursor_down = linefeed_if_not_lf;
            else if (linefeed_is_newline != 1) {
                if (new_line_delay > 0) {
-                   sprintf(buf, "%s$<%d>", C_LF, new_line_delay);
+                   _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+                               "%s$<%d>", C_LF, new_line_delay);
                    scroll_forward = _nc_save_str(buf);
                } else
                    scroll_forward = _nc_save_str(C_LF);
                    scroll_forward = _nc_save_str(buf);
                } else
                    scroll_forward = _nc_save_str(C_LF);
@@ -697,7 +704,8 @@ postprocess_termcap(TERMTYPE *tp, bool has_base)
        if (WANTED(newline)) {
            if (linefeed_is_newline == 1) {
                if (new_line_delay > 0) {
        if (WANTED(newline)) {
            if (linefeed_is_newline == 1) {
                if (new_line_delay > 0) {
-                   sprintf(buf, "%s$<%d>", C_LF, new_line_delay);
+                   _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+                               "%s$<%d>", C_LF, new_line_delay);
                    newline = _nc_save_str(buf);
                } else
                    newline = _nc_save_str(C_LF);
                    newline = _nc_save_str(buf);
                } else
                    newline = _nc_save_str(C_LF);
@@ -739,7 +747,8 @@ postprocess_termcap(TERMTYPE *tp, bool has_base)
         */
        if (WANTED(tab)) {
            if (horizontal_tab_delay > 0) {
         */
        if (WANTED(tab)) {
            if (horizontal_tab_delay > 0) {
-               sprintf(buf, "%s$<%d>", C_HT, horizontal_tab_delay);
+               _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+                           "%s$<%d>", C_HT, horizontal_tab_delay);
                tab = _nc_save_str(buf);
            } else
                tab = _nc_save_str(C_HT);
                tab = _nc_save_str(buf);
            } else
                tab = _nc_save_str(C_HT);
@@ -776,7 +785,7 @@ postprocess_termcap(TERMTYPE *tp, bool has_base)
      * isn't from mytinfo...
      */
     if (PRESENT(other_non_function_keys)) {
      * isn't from mytinfo...
      */
     if (PRESENT(other_non_function_keys)) {
-       char *base = other_non_function_keys;
+       char *base;
        char *bp, *cp, *dp;
        struct name_table_entry const *from_ptr;
        struct name_table_entry const *to_ptr;
        char *bp, *cp, *dp;
        struct name_table_entry const *from_ptr;
        struct name_table_entry const *to_ptr;
@@ -844,7 +853,7 @@ postprocess_termcap(TERMTYPE *tp, bool has_base)
                } else
                    *dp++ = *bp;
            }
                } else
                    *dp++ = *bp;
            }
-           *dp++ = '\0';
+           *dp = '\0';
 
            tp->Strings[to_ptr->nte_index] = _nc_save_str(buf2);
        }
 
            tp->Strings[to_ptr->nte_index] = _nc_save_str(buf2);
        }