ncurses 5.9 - patch 20141221
[ncurses.git] / ncurses / tinfo / comp_parse.c
index a1f9f4a877fb634cec5bc3a04fe48a9b97e7ce43..82a61a52e35d1dac97b75c6ce8b46e5a3aa9094c 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2010,2011 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2012,2013 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            *
@@ -47,7 +47,7 @@
 
 #include <tic.h>
 
-MODULE_ID("$Id: comp_parse.c,v 1.77 2011/10/01 22:43:51 tom Exp $")
+MODULE_ID("$Id: comp_parse.c,v 1.90 2013/08/31 15:22:31 tom Exp $")
 
 static void sanity_check2(TERMTYPE *, bool);
 NCURSES_IMPEXP void NCURSES_API(*_nc_check_termtype2) (TERMTYPE *, bool) = sanity_check2;
@@ -56,7 +56,7 @@ NCURSES_IMPEXP void NCURSES_API(*_nc_check_termtype2) (TERMTYPE *, bool) = sanit
 static void sanity_check(TERMTYPE *);
 NCURSES_IMPEXP void NCURSES_API(*_nc_check_termtype) (TERMTYPE *) = sanity_check;
 
-static void fixup_acsc(TERMTYPE *, bool);
+static void fixup_acsc(TERMTYPE *, int);
 
 static void
 enqueue(ENTRY * ep)
@@ -83,14 +83,14 @@ force_bar(char *dst, char *src)
        if (len > MAX_NAME_SIZE)
            len = MAX_NAME_SIZE;
        (void) strncpy(dst, src, len);
-       (void) strcpy(dst + len, "|");
+       _nc_STRCPY(dst + len, "|", MAX_NAME_SIZE);
        src = dst;
     }
     return src;
 }
 #define ForceBar(dst, src) ((strchr(src, '|') == 0) ? force_bar(dst, src) : src)
 
-#if USE_TERMCAP && NCURSES_XNAMES
+#if NCURSES_USE_TERMCAP && NCURSES_XNAMES
 static char *
 skip_index(char *name)
 {
@@ -113,7 +113,7 @@ check_collisions(char *n1, char *n2, int counter)
     n1 = ForceBar(nc1, n1);
     n2 = ForceBar(nc2, n2);
 
-#if USE_TERMCAP && NCURSES_XNAMES
+#if NCURSES_USE_TERMCAP && NCURSES_XNAMES
     if ((_nc_syntax == SYN_TERMCAP) && _nc_user_definable) {
        n1 = skip_index(n1);
        n2 = skip_index(n2);
@@ -162,18 +162,15 @@ name_ending(char *name)
 static bool
 remove_collision(char *n1, char *n2)
 {
-    char *p1 = n1;
     char *p2 = n2;
     char *pstart, *qstart, *pend, *qend;
     bool removed = FALSE;
 
-#if USE_TERMCAP && NCURSES_XNAMES
+#if NCURSES_USE_TERMCAP && NCURSES_XNAMES
     if ((_nc_syntax == SYN_TERMCAP) && _nc_user_definable) {
-       p1 = n1 = skip_index(n1);
+       n1 = skip_index(n1);
        p2 = n2 = skip_index(n2);
     }
-#else
-    (void) p1;
 #endif
 
     for (pstart = n1; (pend = name_ending(pstart)); pstart = next_name(pend)) {
@@ -348,9 +345,7 @@ _nc_resolve_uses2(bool fullresolve, bool literal)
                    DEBUG(2, ("%s: resolving use=%s (compiled)",
                              child, lookfor));
 
-                   rp = typeMalloc(ENTRY, 1);
-                   if (rp == 0)
-                       _nc_err_abort(MSG_NO_MEMORY);
+                   TYPE_MALLOC(ENTRY, 1, rp);
                    rp->tterm = thisterm;
                    rp->nuses = 0;
                    rp->next = lastread;
@@ -470,7 +465,34 @@ _nc_resolve_uses2(bool fullresolve, bool literal)
            for_entry_list(qp) {
                _nc_curr_line = (int) qp->startline;
                _nc_set_type(_nc_first_name(qp->tterm.term_names));
-               fixup_acsc(&qp->tterm, literal);
+               /*
+                * tic overrides this function pointer to provide more verbose
+                * checking.
+                */
+               if (_nc_check_termtype2 != sanity_check2) {
+                   SCREEN *save_SP = SP;
+                   SCREEN fake_sp;
+                   TERMINAL fake_tm;
+                   TERMINAL *save_tm = cur_term;
+
+                   /*
+                    * Setup so that tic can use ordinary terminfo interface
+                    * to obtain capability information.
+                    */
+                   memset(&fake_sp, 0, sizeof(fake_sp));
+                   memset(&fake_tm, 0, sizeof(fake_tm));
+                   fake_sp._term = &fake_tm;
+                   fake_tm.type = qp->tterm;
+                   _nc_set_screen(&fake_sp);
+                   set_curterm(&fake_tm);
+
+                   _nc_check_termtype2(&qp->tterm, literal);
+
+                   _nc_set_screen(save_SP);
+                   set_curterm(save_tm);
+               } else {
+                   fixup_acsc(&qp->tterm, literal);
+               }
            }
            DEBUG(2, ("SANITY CHECK FINISHED"));
        }
@@ -495,7 +517,7 @@ _nc_resolve_uses(bool fullresolve)
 #define CUR tp->
 
 static void
-fixup_acsc(TERMTYPE *tp, bool literal)
+fixup_acsc(TERMTYPE *tp, int literal)
 {
     if (!literal) {
        if (acs_chars == 0
@@ -525,6 +547,7 @@ sanity_check2(TERMTYPE *tp, bool literal)
 #endif /* __UNUSED__ */
        PAIRED(enter_standout_mode, exit_standout_mode);
        PAIRED(enter_underline_mode, exit_underline_mode);
+       PAIRED(enter_italics_mode, exit_italics_mode);
     }
 
     /* we do this check/fix in postprocess_termcap(), but some packagers