Upgraded to mh-e version 6.1.1.
[bpt/emacs.git] / src / termcap.c
index d26348e..8918f06 100644 (file)
@@ -1,5 +1,6 @@
 /* Work-alike for termcap, plus extra features.
-   Copyright (C) 1985, 86, 93, 94, 95 Free Software Foundation, Inc.
+   Copyright (C) 1985, 86, 93, 94, 95, 2000, 2001
+   Free Software Foundation, Inc.
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -13,20 +14,27 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
 /* Emacs config.h may rename various library functions such as malloc.  */
 #ifdef HAVE_CONFIG_H
-
 #include <config.h>
+#endif
+
+#ifdef emacs
 
+#include <lisp.h>              /* xmalloc is here */
 /* Get the O_* definitions for open et al.  */
 #include <sys/file.h>
-#ifdef USG5
+#ifdef HAVE_FCNTL_H
 #include <fcntl.h>
 #endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
 
-#else /* not HAVE_CONFIG_H */
+#else /* not emacs */
 
 #ifdef STDC_HEADERS
 #include <stdlib.h>
@@ -49,7 +57,7 @@ char *realloc ();
 #include <fcntl.h>
 #endif
 
-#endif /* not HAVE_CONFIG_H */
+#endif /* not emacs */
 
 #ifndef NULL
 #define NULL (char *) 0
@@ -136,6 +144,9 @@ find_capability (bp, cap)
   return NULL;
 }
 
+/* These are already defined in the System framework in Mac OS X and
+   cause prebinding to fail.  */
+#ifndef MAC_OSX
 int
 tgetnum (cap)
      char *cap;
@@ -169,7 +180,19 @@ tgetstr (cap, area)
     return NULL;
   return tgetst1 (ptr, area);
 }
+#endif /* MAC_OSX */
+
+#ifdef IS_EBCDIC_HOST
+/* Table, indexed by a character in range 0200 to 0300 with 0200 subtracted,
+   gives meaning of character following \, or a space if no special meaning.
+   Sixteen characters per line within the string.  */
 
+static char esctab[]
+  = " \057\026  \047\014         \
+     \025   \015      \
+   \005 \013          \
+                ";
+#else
 /* Table, indexed by a character in range 0100 to 0140 with 0100 subtracted,
    gives meaning of character following \, or a space if no special meaning.
    Eight characters per line within the string.  */
@@ -179,6 +202,7 @@ static char esctab[]
       \012 \
   \015 \011 \013 \
         ";
+#endif
 
 /* PTR points to a string value inside a termcap entry.
    Copy that value, processing \ and ^ abbreviations,
@@ -242,12 +266,21 @@ tgetst1 (ptr, area)
                  p++;
                }
            }
+#ifdef IS_EBCDIC_HOST
+         else if (c >= 0200 && c < 0360)
+           {
+             c1 = esctab[(c & ~0100) - 0200];
+             if (c1 != ' ')
+               c = c1;
+           }
+#else
          else if (c >= 0100 && c < 0200)
            {
              c1 = esctab[(c & ~040) - 0100];
              if (c1 != ' ')
                c = c1;
            }
+#endif
        }
       *r++ = c;
     }
@@ -260,11 +293,19 @@ tgetst1 (ptr, area)
 \f
 /* Outputting a string with padding.  */
 
+#ifndef emacs
 short ospeed;
 /* If OSPEED is 0, we use this as the actual baud rate.  */
 int tputs_baud_rate;
+#endif
+
+/* Already defined in the System framework in Mac OS X and causes
+   prebinding to fail.  */
+#ifndef MAC_OSX
 char PC;
+#endif  /* MAC_OSX */
 
+#ifndef emacs
 /* Actual baud rate if positive;
    - baud rate / 100 if negative.  */
 
@@ -279,6 +320,11 @@ static int speeds[] =
 #endif /* not VMS */
   };
 
+#endif /* not emacs */
+
+/* Already defined in the System framework in Mac OS X and causes
+   prebinding to fail.  */
+#ifndef MAC_OSX
 void
 tputs (str, nlines, outfun)
      register char *str;
@@ -289,7 +335,7 @@ tputs (str, nlines, outfun)
   register int speed;
 
 #ifdef emacs
-  extern baud_rate;
+  extern EMACS_INT baud_rate;
   speed = baud_rate;
   /* For quite high speeds, convert to the smaller
      units to avoid overflow.  */
@@ -341,10 +387,11 @@ tputs (str, nlines, outfun)
   while (padcount-- > 0)
     (*outfun) (PC);
 }
+#endif /* MAC_OSX */
 \f
 /* Finding the termcap entry in the termcap data base.  */
 
-struct buffer
+struct termcap_buffer
   {
     char *beg;
     int size;
@@ -411,19 +458,22 @@ valid_filename_p (fn)
    0 if the data base is accessible but the type NAME is not defined
    in it, and some other value otherwise.  */
 
+/* Already defined in the System framework in Mac OS X and causes
+   prebinding to fail.  */
+#ifndef MAC_OSX
 int
 tgetent (bp, name)
      char *bp, *name;
 {
   register char *termcap_name;
   register int fd;
-  struct buffer buf;
+  struct termcap_buffer buf;
   register char *bp1;
-  char *bp2;
+  char *tc_search_point;
   char *term;
   int malloc_size = 0;
   register int c;
-  char *tcenv;                 /* TERMCAP value, if it contains :tc=.  */
+  char *tcenv = NULL;          /* TERMCAP value, if it contains :tc=.  */
   char *indirect = NULL;       /* Terminal type in :tc= in TERMCAP value.  */
   int filep;
 
@@ -443,6 +493,11 @@ tgetent (bp, name)
     }
 #endif /* INTERNAL_TERMINAL */
 
+  /* For compatibility with programs like `less' that want to
+     put data in the termcap buffer themselves as a fallback.  */
+  if (bp)
+    term_entry = bp;
+
   termcap_name = getenv ("TERMCAP");
   if (termcap_name && *termcap_name == '\0')
     termcap_name = NULL;
@@ -502,7 +557,7 @@ tgetent (bp, name)
       malloc_size = indirect ? strlen (tcenv) + 1 : buf.size;
       bp = (char *) xmalloc (malloc_size);
     }
-  bp1 = bp;
+  tc_search_point = bp1 = bp;
 
   if (indirect)
     /* Copy the data from the environment variable.  */
@@ -530,14 +585,13 @@ tgetent (bp, name)
       /* If BP is malloc'd by us, make sure it is big enough.  */
       if (malloc_size)
        {
-         malloc_size = bp1 - bp + buf.size;
-         termcap_name = (char *) xrealloc (bp, malloc_size);
-         bp1 += termcap_name - bp;
-         bp = termcap_name;
+         int offset1 = bp1 - bp, offset2 = tc_search_point - bp;
+         malloc_size = offset1 + buf.size;
+         bp = termcap_name = (char *) xrealloc (bp, malloc_size);
+         bp1 = termcap_name + offset1;
+         tc_search_point = termcap_name + offset2;
        }
 
-      bp2 = bp1;
-
       /* Copy the line of the entry from buf into bp.  */
       termcap_name = buf.ptr;
       while ((*bp1++ = c = *termcap_name++) && c != '\n')
@@ -551,7 +605,8 @@ tgetent (bp, name)
 
       /* Does this entry refer to another terminal type's entry?
         If something is found, copy it into heap and null-terminate it.  */
-      term = tgetst1 (find_capability (bp2, "tc"), (char **) 0);
+      tc_search_point = find_capability (tc_search_point, "tc");
+      term = tgetst1 (tc_search_point, (char **) 0);
     }
 
   close (fd);
@@ -564,6 +619,7 @@ tgetent (bp, name)
   term_entry = bp;
   return 1;
 }
+#endif /* MAC_OSX */
 
 /* Given file open on FD and buffer BUFP,
    scan the file from the beginning until a line is found
@@ -575,7 +631,7 @@ static int
 scan_file (str, fd, bufp)
      char *str;
      int fd;
-     register struct buffer *bufp;
+     register struct termcap_buffer *bufp;
 {
   register char *end;
 
@@ -671,7 +727,7 @@ compare_contin (str1, str2)
 static char *
 gobble_line (fd, bufp, append_end)
      int fd;
-     register struct buffer *bufp;
+     register struct termcap_buffer *bufp;
      char *append_end;
 {
   register char *end;
@@ -772,4 +828,3 @@ tprint (cap)
 }
 
 #endif /* TEST */
-