]> code.delx.au - gnu-emacs/blobdiff - src/cm.c
(Text): Replace inforef to emacs-xtra by conditional xref's, depending on
[gnu-emacs] / src / cm.c
index f0ea1e26f1c84fcd62c52d5ca2090296d54b72a6..dd25c112630779dfe5405062c2ba55799905c200 100644 (file)
--- a/src/cm.c
+++ b/src/cm.c
@@ -1,5 +1,6 @@
 /* Cursor motion subroutines for GNU Emacs.
-   Copyright (C) 1985 Free Software Foundation, Inc.
+   Copyright (C) 1985, 1995, 2002, 2003, 2004,
+                 2005, 2006 Free Software Foundation, Inc.
     based primarily on public domain code written by Chris Torek
 
 This file is part of GNU Emacs.
@@ -16,7 +17,8 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  */
 
 
 #include <config.h>
@@ -24,16 +26,26 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "cm.h"
 #include "termhooks.h"
 
+/* For now, don't try to include termcap.h.  On some systems,
+   configure finds a non-standard termcap.h that the main build
+   won't find.  */
+
+#if defined HAVE_TERMCAP_H && 0
+#include <termcap.h>
+#else
+extern void tputs P_ ((const char *, int, int (*)(int)));
+extern char *tgoto P_ ((const char *, int, int));
+#endif
+
 #define        BIG     9999            /* 9999 good on VAXen.  For 16 bit machines
                                   use about 2000.... */
 
-char *tgoto ();
-
 extern char *BC, *UP;
 
 int cost;              /* sums up costs */
 
 /* ARGSUSED */
+int
 evalcost (c)
      char c;
 {
@@ -41,6 +53,7 @@ evalcost (c)
   return c;
 }
 
+int
 cmputc (c)
      char c;
 {
@@ -99,12 +112,42 @@ addcol (n) {
 }
 #endif
 
+/*
+ * Terminals with magicwrap (xn) don't all behave identically.
+ * The VT100 leaves the cursor in the last column but will wrap before
+ * printing the next character.  I hear that the Concept terminal does
+ * the wrap immediately but ignores the next newline it sees.  And some
+ * terminals just have buggy firmware, and think that the cursor is still
+ * in limbo if we use direct cursor addressing from the phantom column.
+ * The only guaranteed safe thing to do is to emit a CRLF immediately
+ * after we reach the last column; this takes us to a known state.
+ */
+void
+cmcheckmagic ()
+{
+  if (curX == FrameCols)
+    {
+      if (!MagicWrap || curY >= FrameRows - 1)
+       abort ();
+      if (termscript)
+       putc ('\r', termscript);
+      putchar ('\r');
+      if (termscript)
+       putc ('\n', termscript);
+      putchar ('\n');
+      curX = 0;
+      curY++;
+    }
+}
+
+
 /*
  * (Re)Initialize the cost factors, given the output speed of the terminal
  * in the variable ospeed.  (Note: this holds B300, B9600, etc -- ie stuff
  * out of <sgtty.h>.)
  */
 
+void
 cmcostinit ()
 {
     char *p;
@@ -144,8 +187,9 @@ cmcostinit ()
  * actually perform the motion.
  */
 
-static
+static int
 calccost (srcy, srcx, dsty, dstx, doit)
+     int srcy, srcx, dsty, dstx, doit;
 {
     register int    deltay,
                     deltax,
@@ -181,7 +225,7 @@ calccost (srcy, srcx, dsty, dstx, doit)
     if (doit)
        while (--deltay >= 0)
            tputs (p, 1, cmputc);
-x: 
+x:
     if ((deltax = dstx - srcx) == 0)
        goto done;
     if (deltax < 0) {
@@ -192,7 +236,7 @@ x:
     if (Wcm.cc_tab >= BIG || !Wcm.cm_usetabs)
        goto olddelta;          /* forget it! */
 
-    /* 
+    /*
      * ntabs is # tabs towards but not past dstx; n2tabs is one more
      * (ie past dstx), but this is only valid if that is not past the
      * right edge of the screen.  We can check that at the same time
@@ -208,7 +252,7 @@ x:
     if (tab2x >= Wcm.cm_cols)  /* too far (past edge) */
        n2tabs = 0;
 
-    /* 
+    /*
      * Now set tabcost to the cost for using ntabs, and c to the cost
      * for using n2tabs, then pick the minimum.
      */
@@ -227,7 +271,7 @@ x:
     if (tabcost >= BIG)                /* caint use tabs */
        goto newdelta;
 
-    /* 
+    /*
      * See if tabcost is less than just moving right
      */
 
@@ -239,20 +283,20 @@ x:
        srcx = tabx;
     }
 
-    /* 
+    /*
      * Now might as well just recompute the delta.
      */
 
-newdelta: 
+newdelta:
     if ((deltax = dstx - srcx) == 0)
        goto done;
-olddelta: 
+olddelta:
     if (deltax > 0)
        p = Wcm.cm_right, c = Wcm.cc_right;
     else
        p = Wcm.cm_left, c = Wcm.cc_left, deltax = -deltax;
 
-dodelta: 
+dodelta:
     if (c == BIG) {            /* caint get thar from here */
 fail:
        if (doit)
@@ -263,7 +307,7 @@ fail:
     if (doit)
        while (--deltax >= 0)
            tputs (p, 1, cmputc);
-done: 
+done:
     return totalcost;
 }
 
@@ -279,7 +323,9 @@ losecursor ()
 #define        USELL   2
 #define        USECR   3
 
+void
 cmgoto (row, col)
+     int row, col;
 {
     int     homecost,
             crcost,
@@ -334,7 +380,7 @@ cmgoto (row, col)
       dcm = Wcm.cm_abs;
     }
 
-  /* 
+  /*
    * In the following comparison, the = in <= is because when the costs
    * are the same, it looks nicer (I think) to move directly there.
    */
@@ -355,17 +401,17 @@ cmgoto (row, col)
 
   switch (use)
     {
-    case USEHOME: 
+    case USEHOME:
       tputs (Wcm.cm_home, 1, cmputc);
       curY = 0, curX = 0;
       break;
 
-    case USELL: 
+    case USELL:
       tputs (Wcm.cm_ll, 1, cmputc);
       curY = Wcm.cm_rows - 1, curX = 0;
       break;
 
-    case USECR: 
+    case USECR:
       tputs (Wcm.cm_cr, 1, cmputc);
       if (Wcm.cm_autolf)
        curY++;
@@ -381,6 +427,7 @@ cmgoto (row, col)
    Used before copying into it the info on the actual terminal.
  */
 
+void
 Wcm_clear ()
 {
   bzero (&Wcm, sizeof Wcm);
@@ -395,6 +442,7 @@ Wcm_clear ()
  * Return -2 if size not specified.
  */
 
+int
 Wcm_init ()
 {
 #if 0
@@ -413,3 +461,6 @@ Wcm_init ()
     return - 2;
   return 0;
 }
+
+/* arch-tag: bcf64c02-00f6-44ef-94b6-c56eab5b3dc4
+   (do not change this comment) */