]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - ncurses/tinfo/lib_termcap.c
ncurses 5.7 - patch 20090314
[ncurses.git] / ncurses / tinfo / lib_termcap.c
index 33e15c55c179e569a6580446baef555aad4185f4..2d245ffbb61f345db2ca0741134ca3c7c6804f84 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
 /****************************************************************************
- * Copyright (c) 1998-2005,2006 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            *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
 
 #include <term_entry.h>
 
 
 #include <term_entry.h>
 
-MODULE_ID("$Id: lib_termcap.c,v 1.58 2006/09/02 19:39:46 Miroslav.Lichvar Exp $")
+MODULE_ID("$Id: lib_termcap.c,v 1.63 2008/08/16 19:22:55 tom Exp $")
 
 NCURSES_EXPORT_VAR(char *) UP = 0;
 NCURSES_EXPORT_VAR(char *) BC = 0;
 
 
 NCURSES_EXPORT_VAR(char *) UP = 0;
 NCURSES_EXPORT_VAR(char *) BC = 0;
 
-typedef struct {
-    long sequence;
-    char *fix_sgr0;            /* this holds the filtered sgr0 string */
-    char *last_bufp;           /* help with fix_sgr0 leak */
-    TERMINAL *last_term;
-} CACHE;
+#define MyCache  _nc_globals.tgetent_cache
+#define CacheInx _nc_globals.tgetent_index
+#define CacheSeq _nc_globals.tgetent_sequence
 
 
-#define MAX_CACHE 4
-static CACHE cache[MAX_CACHE];
-static int in_cache = 0;
-
-#define FIX_SGR0 cache[in_cache].fix_sgr0
-#define LAST_TRM cache[in_cache].last_term
-#define LAST_BUF cache[in_cache].last_bufp
-#define LAST_SEQ cache[in_cache].sequence
+#define FIX_SGR0 MyCache[CacheInx].fix_sgr0
+#define LAST_TRM MyCache[CacheInx].last_term
+#define LAST_BUF MyCache[CacheInx].last_bufp
+#define LAST_USE MyCache[CacheInx].last_used
+#define LAST_SEQ MyCache[CacheInx].sequence
 
 /***************************************************************************
  *
 
 /***************************************************************************
  *
@@ -84,8 +78,6 @@ static int in_cache = 0;
 NCURSES_EXPORT(int)
 tgetent(char *bufp, const char *name)
 {
 NCURSES_EXPORT(int)
 tgetent(char *bufp, const char *name)
 {
-    static long sequence;
-
     int errcode;
     int n;
     bool found_cache = FALSE;
     int errcode;
     int n;
     bool found_cache = FALSE;
@@ -100,11 +92,17 @@ tgetent(char *bufp, const char *name)
      * caller, but if tgetent() is called with the same buffer, that is
      * good enough, since the previous data would be invalidated by the
      * current call.
      * caller, but if tgetent() is called with the same buffer, that is
      * good enough, since the previous data would be invalidated by the
      * current call.
+     *
+     * bufp may be a null pointer, e.g., GNU termcap.  That allocates data,
+     * which is good until the next tgetent() call.  The conventional termcap
+     * is inconvenient because of the fixed buffer size, but because it uses
+     * caller-supplied buffers, can have multiple terminal descriptions in
+     * use at a given time.
      */
      */
-    for (n = 0; n < MAX_CACHE; ++n) {
-       bool same_result = (bufp != 0 && cache[n].last_bufp == bufp);
+    for (n = 0; n < TGETENT_MAX; ++n) {
+       bool same_result = (MyCache[n].last_used && MyCache[n].last_bufp == bufp);
        if (same_result) {
        if (same_result) {
-           in_cache = n;
+           CacheInx = n;
            if (FIX_SGR0 != 0) {
                FreeAndNull(FIX_SGR0);
            }
            if (FIX_SGR0 != 0) {
                FreeAndNull(FIX_SGR0);
            }
@@ -114,10 +112,10 @@ tgetent(char *bufp, const char *name)
            if (LAST_TRM != 0 && LAST_TRM != cur_term) {
                TERMINAL *trm = LAST_TRM;
                del_curterm(LAST_TRM);
            if (LAST_TRM != 0 && LAST_TRM != cur_term) {
                TERMINAL *trm = LAST_TRM;
                del_curterm(LAST_TRM);
-               for (in_cache = 0; in_cache < MAX_CACHE; ++in_cache)
+               for (CacheInx = 0; CacheInx < TGETENT_MAX; ++CacheInx)
                    if (LAST_TRM == trm)
                        LAST_TRM = 0;
                    if (LAST_TRM == trm)
                        LAST_TRM = 0;
-               in_cache = n;
+               CacheInx = n;
            }
            found_cache = TRUE;
            break;
            }
            found_cache = TRUE;
            break;
@@ -126,15 +124,15 @@ tgetent(char *bufp, const char *name)
     if (!found_cache) {
        int best = 0;
 
     if (!found_cache) {
        int best = 0;
 
-       for (in_cache = 0; in_cache < MAX_CACHE; ++in_cache) {
-           if (LAST_SEQ < cache[best].sequence) {
-               best = in_cache;
+       for (CacheInx = 0; CacheInx < TGETENT_MAX; ++CacheInx) {
+           if (LAST_SEQ < MyCache[best].sequence) {
+               best = CacheInx;
            }
        }
            }
        }
-       in_cache = best;
+       CacheInx = best;
     }
     LAST_TRM = cur_term;
     }
     LAST_TRM = cur_term;
-    LAST_SEQ = ++sequence;
+    LAST_SEQ = ++CacheSeq;
 
     PC = 0;
     UP = 0;
 
     PC = 0;
     UP = 0;
@@ -144,7 +142,7 @@ tgetent(char *bufp, const char *name)
     if (errcode == 1) {
 
        if (cursor_left)
     if (errcode == 1) {
 
        if (cursor_left)
-           if ((backspaces_with_bs = !strcmp(cursor_left, "\b")) == 0)
+           if ((backspaces_with_bs = (char) !strcmp(cursor_left, "\b")) == 0)
                backspace_if_not_bs = cursor_left;
 
        /* we're required to export these */
                backspace_if_not_bs = cursor_left;
 
        /* we're required to export these */
@@ -164,7 +162,9 @@ tgetent(char *bufp, const char *name)
            }
        }
        LAST_BUF = bufp;
            }
        }
        LAST_BUF = bufp;
+       LAST_USE = TRUE;
 
 
+       SetNoPadding(SP);
        (void) baudrate();      /* sets ospeed as a side-effect */
 
 /* LINT_PREPRO
        (void) baudrate();      /* sets ospeed as a side-effect */
 
 /* LINT_PREPRO
@@ -282,9 +282,10 @@ tgetstr(NCURSES_CONST char *id, char **area)
 NCURSES_EXPORT(void)
 _nc_tgetent_leaks(void)
 {
 NCURSES_EXPORT(void)
 _nc_tgetent_leaks(void)
 {
-    for (in_cache = 0; in_cache < MAX_CACHE; ++in_cache) {
+    for (CacheInx = 0; CacheInx < TGETENT_MAX; ++CacheInx) {
        FreeIfNeeded(FIX_SGR0);
        FreeIfNeeded(FIX_SGR0);
-       del_curterm(LAST_TRM);
+       if (LAST_TRM != 0)
+           del_curterm(LAST_TRM);
     }
 }
 #endif
     }
 }
 #endif