(Fdump_emacs): Don't take address of array.
[bpt/emacs.git] / src / term.c
index e681c7f..6de8227 100644 (file)
@@ -1,5 +1,5 @@
 /* terminal control module for terminals described by TERMCAP
-   Copyright (C) 1985, 1986, 1987, 1993, 1994 Free Software Foundation, Inc.
+   Copyright (C) 1985, 86, 87, 93, 94, 95 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -114,7 +114,7 @@ int (*frame_up_to_date_hook) ();
 
    This should clear mouse_moved until the next motion
    event arrives.  */
-void (*mouse_position_hook) ( /* FRAME_PTR *f,
+void (*mouse_position_hook) ( /* FRAME_PTR *f, int insist,
                                 Lisp_Object *bar_window,
                                 enum scroll_bar_part *part,
                                 Lisp_Object *x,
@@ -254,8 +254,14 @@ static int se_is_so;       /* 1 if same string both enters and leaves
 
 /* internal state */
 
+/* The largest frame width in any call to calculate_costs.  */
+int max_frame_width;
+/* The largest frame height in any call to calculate_costs.  */
+int max_frame_height;
+
 /* Number of chars of space used for standout marker at beginning of line,
    or'd with 0100.  Zero if no standout marker at all.
+   The length of these vectors is max_frame_height.
 
    Used IFF TN_standout_width >= 0. */
 
@@ -1014,7 +1020,8 @@ per_line_cost (str)
 
 #ifndef old
 /* char_ins_del_cost[n] is cost of inserting N characters.
-   char_ins_del_cost[-n] is cost of deleting N characters. */
+   char_ins_del_cost[-n] is cost of deleting N characters.
+   The length of this vector is based on max_frame_width.  */
 
 int *char_ins_del_vector;
 
@@ -1115,30 +1122,33 @@ calculate_costs (frame)
      chars_wasted and copybuf are only used here in term.c in cases where
      the term hook isn't called. */
 
+  max_frame_height = max (max_frame_height, FRAME_HEIGHT (frame));
+  max_frame_width = max (max_frame_width, FRAME_WIDTH (frame));
+
   if (chars_wasted != 0)
-    chars_wasted = (char *) xrealloc (chars_wasted, FRAME_HEIGHT (frame));
+    chars_wasted = (char *) xrealloc (chars_wasted, max_frame_height);
   else
-    chars_wasted = (char *) xmalloc (FRAME_HEIGHT (frame));
+    chars_wasted = (char *) xmalloc (max_frame_height);
 
   if (copybuf != 0)
-    copybuf = (char *) xrealloc (copybuf, FRAME_HEIGHT (frame));
+    copybuf = (char *) xrealloc (copybuf, max_frame_height);
   else
-    copybuf = (char *) xmalloc (FRAME_HEIGHT (frame));
+    copybuf = (char *) xmalloc (max_frame_height);
 
   if (char_ins_del_vector != 0)
     char_ins_del_vector
       = (int *) xrealloc (char_ins_del_vector,
                          (sizeof (int)
-                          + 2 * FRAME_WIDTH (frame) * sizeof (int)));
+                          + 2 * max_frame_width * sizeof (int)));
   else
     char_ins_del_vector
       = (int *) xmalloc (sizeof (int)
-                        + 2 * FRAME_WIDTH (frame) * sizeof (int));
+                        + 2 * max_frame_width * sizeof (int));
 
-  bzero (chars_wasted, FRAME_HEIGHT (frame));
-  bzero (copybuf, FRAME_HEIGHT (frame));
+  bzero (chars_wasted, max_frame_height);
+  bzero (copybuf, max_frame_height);
   bzero (char_ins_del_vector, (sizeof (int)
-                              + 2 * FRAME_WIDTH (frame) * sizeof (int)));
+                              + 2 * max_frame_width * sizeof (int)));
 
   if (f && (!TS_ins_line && !TS_del_line))
     do_line_insertion_deletion_costs (frame,
@@ -1427,15 +1437,31 @@ term_init (terminal_type)
 
   status = tgetent (buffer, terminal_type);
   if (status < 0)
-    fatal ("Cannot open termcap database file.\n");
+    {
+#ifdef TERMINFO
+      fatal ("Cannot open terminfo database file.\n");
+#else
+      fatal ("Cannot open termcap database file.\n");
+#endif
+    }
   if (status == 0)
-    fatal ("Terminal type %s is not defined.\n\
+    {
+#ifdef TERMINFO
+      fatal ("Terminal type %s is not defined.\n\
+If that is not the actual type of terminal you have,\n\
+use the Bourne shell command `TERM=... export TERM' (C-shell:\n\
+`setenv TERM ...') to specify the correct type.  It may be necessary\n\
+to do `unset TERMINFO' (C-shell: `unsetenv TERMINFO') as well.\n",
+            terminal_type);
+#else
+      fatal ("Terminal type %s is not defined.\n\
 If that is not the actual type of terminal you have,\n\
 use the Bourne shell command `TERM=... export TERM' (C-shell:\n\
 `setenv TERM ...') to specify the correct type.  It may be necessary\n\
 to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.\n",
-          terminal_type);
-
+            terminal_type);
+#endif
+    }
 #ifdef TERMINFO
   area = (char *) malloc (2044);
 #else
@@ -1507,7 +1533,10 @@ to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.\n",
   MultiLeft = tgetstr ("LE", address);
   MultiRight = tgetstr ("RI", address);
 
-  AutoWrap = tgetflag ("am");
+  MagicWrap = tgetflag ("xn");
+  /* Since we make MagicWrap terminals look like AutoWrap, we need to have
+     the former flag imply the latter.  */
+  AutoWrap = MagicWrap || tgetflag ("am");
   memory_below_frame = tgetflag ("db");
   TF_hazeltine = tgetflag ("hz");
   must_write_spaces = tgetflag ("in");
@@ -1515,7 +1544,6 @@ to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.\n",
   TF_insmode_motion = tgetflag ("mi");
   TF_standout_motion = tgetflag ("ms");
   TF_underscore = tgetflag ("ul");
-  MagicWrap = tgetflag ("xn");
   TF_xs = tgetflag ("xs");
   TF_teleray = tgetflag ("xt");