changeset 5039:f8ae1031c706

merge
author Ben Wing <ben@xemacs.org>
date Sat, 20 Feb 2010 19:04:55 -0600
parents 9410323e4b0d (current diff) 9624523604c5 (diff)
children 3daf9fc57cd4
files man/term.texi src/ChangeLog
diffstat 10 files changed, 282 insertions(+), 441 deletions(-) [+]
line wrap: on
line diff
--- a/man/ChangeLog	Sat Feb 20 03:46:22 2010 -0600
+++ b/man/ChangeLog	Sat Feb 20 19:04:55 2010 -0600
@@ -1,3 +1,8 @@
+2010-02-17  Jerry James  <james@xemacs.org>
+
+	* term.texi: Move to the eterm package.
+	* Makefile: Remove all rules relating to term.texi.
+
 2010-02-10  Stephen J. Turnbull  <stephen@xemacs.org>
 
 	* xemacs-faq.texi (Top): Update menu.
--- a/man/Makefile	Sat Feb 20 03:46:22 2010 -0600
+++ b/man/Makefile	Sat Feb 20 19:04:55 2010 -0600
@@ -54,7 +54,6 @@
 	$(INFODIR)/lispref.info \
 	$(INFODIR)/new-users-guide.info \
 	$(INFODIR)/standards.info \
-	$(INFODIR)/term.info \
 	$(INFODIR)/termcap.info \
 	$(INFODIR)/texinfo.info \
 	$(INFODIR)/widget.info \
@@ -72,7 +71,6 @@
 	$(HTMLDIR)/internals.html \
 	$(HTMLDIR)/new-users-guide.html \
 	$(HTMLDIR)/standards.html \
-	$(HTMLDIR)/term.html \
 	$(HTMLDIR)/termcap.html \
 	$(HTMLDIR)/texinfo.html \
 	$(HTMLDIR)/widget.html \
@@ -90,7 +88,6 @@
 	internals.dvi \
 	new-users-guide.dvi \
 	standards.dvi \
-	term.dvi \
 	termcap.dvi \
 	texinfo.dvi \
 	widget.dvi \
@@ -108,7 +105,6 @@
        internals.pdf \
        new-users-guide.pdf \
        standards.pdf \
-       term.pdf \
        termcap.pdf \
        texinfo.pdf \
        widget.pdf \
@@ -264,9 +260,6 @@
 $(INFODIR)/standards.info : standards.texi
 	$(MAKEINFO) -o $(INFODIR)/standards.info standards.texi
 
-$(INFODIR)/term.info : term.texi
-	$(MAKEINFO) -o $(INFODIR)/term.info term.texi
-
 $(INFODIR)/termcap.info : termcap.texi
 	$(MAKEINFO) -o $(INFODIR)/termcap.info termcap.texi
 
@@ -375,9 +368,6 @@
 $(HTMLDIR)/standards.html : standards.texi
 	$(TEXI2HTML_SPLIT) standards.texi
 
-$(HTMLDIR)/term.html : term.texi
-	$(TEXI2HTML_SPLIT) term.texi
-
 $(HTMLDIR)/termcap.html : termcap.texi
 	$(TEXI2HTML_SPLIT) termcap.texi
 
--- a/man/term.texi	Sat Feb 20 03:46:22 2010 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,394 +0,0 @@
-@\input texinfo @c -*-texinfo-*-
-@setfilename ../info/term.info
-@settitle XEmacs Terminal Emulator Mode
-
-@titlepage
-@sp 6
-@center @titlefont(XEmacs Terminal Emulator Mode)
-@end titlepage
-
-@ifinfo
-@dircategory XEmacs Editor
-@direntry
-* Term mode: (term).		XEmacs Terminal Emulator Mode.
-@end direntry
-
-@node Top, , (DIR)
-@top Terminal emulator mode
-@end ifinfo
-
-This is some notes about the term Emacs mode.
-
-@menu
-* term mode::
-@end menu
-
-@node term mode
-@chapter XEmacs Terminal Emulator Mode
-
-@menu
-* Overview::
-* Connecting to remote computers::
-* Paging::
-* Terminal escapes::
-@end menu
-
-The @code{term} package includes the major modes @code{term},
-@code{shell}, and @code{gud} (for running gdb or another debugger).
-It is a replacement for the comint mode of Emacs 19,
-as well as shell, gdb, terminal, and telnet modes.
-The package works best with recent releases of Emacs 19,
-but will also work reasonably well with Emacs 18 as well as Lucid Emacs 19.
-
-The file @code{nshell.el} is a wrapper to use unless term mode
-is built into Emacs.  If works around some of the missing
-in older Emacs versions.
-To use it, edit the paths in @code{nshell.el}, appropriately,
-and then @code{M-x load-file nshell.el RET}.
-This will also load in replacement shell and gud modes.
-
-@node Overview
-@section Overview
-
-The @code{term} mode is used to control a program (an "inferior process").
-It sends most keyboard input characters to the program,
-and displays output from the program in the buffer.
-This is similar to the traditional comint mode, and
-modes derived from it (such as shell and gdb modes).
-You can do with the new term-based shell the same sort
-of things you could do with the old shell mode,
-using more or less the same interface.  However, the
-new mode is more flexible, and works somewhat differently.
-
-@menu
-* Output from the inferior::
-* subbuffer:: The sub-buffer
-* altsubbuffer:: The alternate sub-buffer
-* Input to the inferior::
-@end menu
-
-@node Output from the inferior
-@subsection Output from the inferior
-
-In typical usage, output from the inferior is
-added to the end of the buffer.  If needed, the window
-will be scrolled, just like a regular terminal.
-(Only one line at a time will be scrolled, just like
-regular terminals, and in contrast to the old shell mode.)
-Thus the buffer becomes a log of your interaction with the
-inferior, just like the old shell mode.
-
-Like a real terminal, term maintains a "cursor position."
-This is the @code{process-mark} of the inferior process.
-If the process-mark is not at the end of the buffer, output from
-the inferior will overwrite existing text in the buffer.
-This is like a real terminal, but unlike the old shell mode
-(which inserts the output, instead of overwriting).
-
-Some programs (such as Emacs itself) need to control the
-appearance on the screen in detail.  They do this by
-sending special control codes.  The exact control
-codes needed from terminal to terminal, but nowadays
-most terminals and terminal emulators (including xterm)
-understand the so-called "ANSI escape sequences" (first
-popularized by the Digital's VT100 family of terminal).
-The term mode also understands these escape sequences,
-and for each control code does the appropriate thing
-to change the buffer so that the appearance of the window
-will match what it would be on a real terminal.
-(In contrast, the old shell mode doesn't handle
-terminal control codes at all.)
-
-See <...> for the specific control codes.
-
-@node subbuffer
-@subsection The sub-buffer
-
-A program that talks to terminal expects the terminal to have a fixed size. 
-If the program is talking a terminal emulator program such as @code{xterm},
-that size can be changed (if the xterm window is re-sized), but programs
-still assume a logical terminal that has a fixed size independent
-of the amount of output transmitted by the programs.
-
-To programs that use it, the Emacs terminal emulator acts as if it
-too has a fixed size.  The @dfn{sub-buffer} is the part of a @code{term}-mode
-buffer that corresponds to a "normal" terminal.  Most of the time
-(unless you explicitly scroll the window displaying the buffer),
-the sub-buffer is the part of the buffer that is displayed in a window.
-
-The sub-buffer is defined in terms of three buffer-local-variable:
-
-@defvar term-height
-The height of the sub-buffer, in screen lines.
-@end defvar
-
-@defvar term-width
-The width of the sub-buffer, in screen columns.
-@end defvar
-
-@defvar term-home-marker
-The "home" position, that is the top left corner of the sub-buffer.
-@end defvar
-
-The sub-buffer is assumed to be the end part of the buffer;
-the @code{term-home-marker} should never be more than
-@code{term-height} screen lines from the end of the buffer.
-
-@node altsubbuffer
-@subsection The alternate sub-buffer
-
-When a "graphical" program finishes, it is nice to
-restore the screen state to what it was before the program started.
-Many people are used to this behavior from @code{xterm}, and
-its also offered by the @code{term} emulator.
-
-@defun term-switch-to-alternate-sub-buffer set
-If @var{set} is true, and we're not already using the alternate sub-buffer,
-switch to it.  What this means is that the @code{term-home-marker}
-is saved (in the variable @code{term-saved-home-marker}), and the
-@code{term-home-marker} is set to the end of the buffer.
-
-If @var{set} is false and we're using the alternate sub-buffer,
-switch back to the saved sub-buffer.  What this means is that the
-(current, alternate) sub-buffer is deleted (using
-@code{(delete-region term-home-marker (point-max))}), and then the
-@code{term-home-marker} is restored (from @code{term-saved-home-marker}).
-@end defun
-
-@node Input to the inferior
-@subsection Input to the inferior
-
-Characters typed by the user are sent to the inferior.
-How this is done depends on whether the @code{term} buffer
-is in "character" mode or "line" mode.
-(A @code{term} buffer can also be in "pager" mode.
-This is discussed <later>.)
-Which of these is currently active is specified in the mode line.
-The difference between them is the key-bindings available.
-
-In character mode, one character (by default @key{C-c}) is special,
-and is a prefix for various commands.  All other characters are
-sent directly to the inferior process, with no interpretation by Emacs.
-Character mode looks and feels like a real terminal, or a conventional
-terminal emulator such as xterm.
-
-In line mode, key commands mostly have standard Emacs actions.
-Regulars characters insert themselves into the buffer.
-When return is typed, the entire current line of the buffer
-(except possibly the prompt) is sent to the inferior process.
-Line mode is basically the original shell mode from earlier Emacs versions.
-
-To switch from line mode to character mode type @kbd{C-c C-k}.
-To switch from character mode to line mode type @kbd{C-c C-j}.
-
-In either mode, "echoing" of user input is handled by the inferior.
-Therefor, in line mode after an input line at the end of the buffer
-is sent to the inferior, it is deleted from the buffer.
-This is so that the inferior can echo the input, if it wishes
-(which it normally does).
-
-@node Connecting to remote computers
-@section Connecting to remote computers
-
-If you want to login to a remove computer, you can do that just as
-you would expect, using whatever commands you would normally use.
-
-(This is worth emphasizing, because earlier versions of @code{shell}
-mode would not work properly if you tried to log in to some other
-computer, because of the way echoing was handled.  That is why
-there was a separate @code{telnet} mode to partially compensate for
-these problems.  The @code{telnet} mode is no longer needed, and
-is basically obsolete.)
-
-A program that asks you for a password will normally suppress
-echoing of the password, so the password will not show up in the buffer.
-This will happen just as if you were using a real terminal, if
-the buffer is in char mode.  If it is in line mode, the password
-will be temporarily visible, but will be erased when you hit return.
-(This happens automatically; there is no special password processing.)
-
-When you log in to a different machine, you need to specify the
-type of terminal your using.   If you are talking to a Bourne-compatible
-shell, and your system understands the @code{TERMCAP} variable,
-you can use the command @kbd{M-x shell-send-termcap}, which
-sends a string specifying the terminal type and size.
-(This command is also useful after the window has changed size.)
-
-If you need to specify the terminal type manually, you can try the
-terminal types "ansi" or "vt100".
-
-You can of course run gdb on that remote computer.  One useful
-trick:  If you invoke gdb with the @code{--fullname} option,
-it will send special commands to Emacs that will cause Emacs to
-pop up the source files you're debugging.  This will work
-whether or not gdb is running on a different computer than Emacs,
-assuming can access the source files specified by gdb.
-
-@node Paging
-@section Paging
-
-When the pager is enabled, Emacs will "pause" after each screenful
-of output (since the last input sent to the inferior).
-It will enter "pager" mode, which feels a lot like the "more"
-program:  Typing a space requests another screenful of output.
-Other commands request more or less output, or scroll backwards
-in the @code{term} buffer.  In pager mode, type @kbd{h} or @kbd{?}
-to display a help message listing all the available pager mode commands.
-
-In either character or line mode, type @kbd{C-c p} to enable paging,
-and @kbd{C-c D} to disable it.
-
-@node Terminal escapes
-@section Terminal Escape sequences
-
-A program that does "graphics" on a terminal controls the
-terminal by sending strings called @dfn{terminal escape sequences}
-that the terminal (or terminal emulator) interprets as special commands.
-The @code{term} mode includes a terminal emulator that understands
-standard ANSI escape sequences, originally popularized by VT100 terminals,
-and now used by the @code{xterm} program and most modern terminal
-emulator software.
-
-@menu
-* Cursor motion:: Escape sequences to move the cursor
-* Erasing:: Escape commands for erasing text
-* Inserting and deleting:: Escape sequences to insert and delete text
-* Scrolling:: Escape sequences to scroll part of the visible window
-* Command hook::
-* Miscellaneous escapes::
-@end menu
-
-printing chars
-
-tab
-
-LF
-
-@node Cursor motion
-@subsection Escape sequences to move the cursor
-
-@table @kbd
-@item RETURN
-Moves to the beginning of the current screen line.
-
-@item C-b
-Moves backwards one column.  (Tabs are broken up if needed.)
-@comment Line wrap FIXME
-
-@item Esc [ R ; C H
-Move to screen row R, screen column C, where (R=1) is the top row,
-and (C=1) is the leftmost column.  Defaults are R=1 and C=1.
-
-@item Esc [ N A
-Move N (default 1) screen lines up.
-@item Esc [ N B
-Move N (default 1) screen lines down.
-@item Esc [ N C
-Move N (default 1) columns right.
-@item Esc [ N D
-Move N (default 1) columns left.
-@end table
-
-@node Erasing
-@subsection Escape commands for erasing text
-
-These commands "erase" part of the sub-buffer.
-Erasing means replacing by white space; it is not the same as deleting.
-The relative screen positions of things that are not erased remain
-unchanged with each other, as does the relative cursor position.
-
-@table @kbd
-@item E [ J
-Erase from cursor to end of screen.
-@item E [ 0 J
-Same as E [ J.
-@item E [ 1 J
-Erase from home position to point.
-@item E [ 2 J
-Erase whole sub-buffer.
-@item E [ K
-Erase from point to end of screen line.
-@item E [ 0 K
-Same as E [ K.
-@item E [ 1 K
-Erase from beginning of screen line to point.
-@item E [ 2 K
-Erase whole screen line.
-@end table
-
-@node Inserting and deleting
-@subsection Escape sequences to insert and delete text
-
-@table @kbd
-@item Esc [ N L
-Insert N (default 1) blank lines.
-@item Esc [ N M
-Delete N (default 1) lines.
-@item Esc [ N P
-Delete N (default 1) characters.
-@item Esc [ N @@
-Insert N (default 1) spaces.
-@end table
-
-@node Scrolling
-@subsection Escape sequences to scroll part of the visible window
-
-@table @kbd
-@item Esc D
-Scroll forward one screen line.
-
-@item Esc M
-Scroll backwards one screen line.
-
-@item Esc [ T ; B r
-Set the scrolling region to be from lines T down to line B inclusive,
-where line 1 is the topmost line.
-@end table
-
-@node Command hook
-@subsection Command hook
-
-If @kbd{C-z} is seen, any text up to a following @key{LF} is scanned.
-The text in between (not counting the initial C-z or the final LF)
-is passed to the function that is the value of @code{term-command-hook}.
-
-The default value of the @code{term-command-hook} variable
-is the function @code{term-command-hook}, which handles the following:
-
-@table @kbd
-@item C-z C-z FILENAME:LINENUMBER:IGNORED LF
-Set term-pending-frame to @code{(cons "FILENAME" LINENUMBER)}.
-When the buffer is displayed in the current window, show
-the FILENAME in the other window, and show an arrow at LINENUMBER.
-Gdb emits these strings when invoked with the flag --fullname.
-This is used by gdb mode; you can also invoke gdb with this flag
-from shell mode.
-
-@item C-z / DIRNAME LF
-Set the directory of the term buffer to DIRNAME
-
-@item C-z ! LEXPR LF
-Read and evaluate LEXPR as a Lisp expression.
-The result is ignored.
-@end table
-
-@node Miscellaneous escapes
-@subsection Miscellaneous escapes
-
-@table @kbd
-@item C-g (Bell)
-Calls @code{(beep t)}.
-
-@item Esc 7
-Save cursor.
-
-@item Esc 8
-Restore cursor.
-
-@item Esc [ 47 h
-Switch to the alternate sub-buffer,
-@item Esc [ 47 l
-Switch back to the regular sub-buffer,
-@end table
-
-@bye
--- a/nt/ChangeLog	Sat Feb 20 03:46:22 2010 -0600
+++ b/nt/ChangeLog	Sat Feb 20 19:04:55 2010 -0600
@@ -1,3 +1,7 @@
+2010-02-18  Vin Shelton  <acs@xemacs.org>
+
+	* xemacs.mak (INFO_FILES): Removed term.info.
+
 2010-02-11  Vin Shelton  <acs@xemacs.org>
  
  	* xemacs.mak (LIB_SRC_DEFINES): Added PROGRAM_DEFINES to lib_src
--- a/nt/xemacs.mak	Sat Feb 20 03:46:22 2010 -0600
+++ b/nt/xemacs.mak	Sat Feb 20 19:04:55 2010 -0600
@@ -1496,7 +1496,6 @@
 	$(INFODIR)\lispref.info \
 	$(INFODIR)\new-users-guide.info \
 	$(INFODIR)\standards.info \
-	$(INFODIR)\term.info \
 	$(INFODIR)\termcap.info \
 	$(INFODIR)\texinfo.info \
 	$(INFODIR)\widget.info \
--- a/src/ChangeLog	Sat Feb 20 03:46:22 2010 -0600
+++ b/src/ChangeLog	Sat Feb 20 19:04:55 2010 -0600
@@ -67,6 +67,26 @@
 	* tests.c:
 	Fix operation of c-tests.
 
+2010-02-19  Aidan Kehoe  <kehoea@parhasard.net>
+
+	* fns.c (split_string_by_ichar_1):
+	Use better types (e.g., not an Ichar for a buffer size) in this
+	function when dealing with ESCAPECHAR.
+
+2010-02-19  Aidan Kehoe  <kehoea@parhasard.net>
+
+	* fns.c (mapcarX):
+	Correct this function, discarding multiple values when one
+	SEQUENCE is supplied, choosing a better label name.  Correct the
+	comment describing the SOME_OR_EVERY argument.
+
+2010-02-12  Aidan Kehoe  <kehoea@parhasard.net>
+
+	* syswindows.h:
+	Remove the PDWORD_PTR typedef; it's not used in
+	intl-auto-encap-win32.h , and it breaks the build with Visual C++
+	2005 Express Edition and a 2005 copy of the SDK.
+
 2010-02-10  Ben Wing  <ben@xemacs.org>
 
 	* text.h:
@@ -3506,6 +3526,16 @@
 	reasons.
 	
 
+2010-02-07  Aidan Kehoe  <kehoea@parhasard.net>
+
+	* fns.c (split_string_by_ichar_1): Extend this to take UNESCAPE
+	and ESCAPECHAR arguments.
+	(split_external_path, split_env_path, Fsplit_string_by_char)
+	(Fsplit_path):
+	Pass the new arguments to split_string_by_ichar_1(); take a new
+	optional argument, ESCAPE-CHAR, in #'split-string-by-char,
+	allowing SEPCHAR to be escaped.
+
 2010-01-09  Didier Verna  <didier@xemacs.org>
 
 	* glyphs.c (query_string_font): Use proper domain for cachel
--- a/src/fns.c	Sat Feb 20 03:46:22 2010 -0600
+++ b/src/fns.c	Sat Feb 20 19:04:55 2010 -0600
@@ -1053,31 +1053,129 @@
 }
 
 /* Split STRING into a list of substrings.  The substrings are the
-   parts of original STRING separated by SEPCHAR.  */
+   parts of original STRING separated by SEPCHAR.
+
+   If UNESCAPE is non-zero, ESCAPECHAR specifies a character that will quote
+   SEPCHAR, and cause it not to split STRING. A double ESCAPECHAR is
+   necessary for ESCAPECHAR to appear once in a substring. */
+
 static Lisp_Object
 split_string_by_ichar_1 (const Ibyte *string, Bytecount size,
-			  Ichar sepchar)
+                         Ichar sepchar, int unescape, Ichar escapechar)
 {
   Lisp_Object result = Qnil;
   const Ibyte *end = string + size;
 
-  while (1)
+  if (unescape)
     {
-      const Ibyte *p = string;
-      while (p < end)
-	{
-	  if (itext_ichar (p) == sepchar)
-	    break;
-	  INC_IBYTEPTR (p);
-	}
-      result = Fcons (make_string (string, p - string), result);
-      if (p < end)
-	{
-	  string = p;
-	  INC_IBYTEPTR (string);	/* skip sepchar */
-	}
-      else
-	break;
+      Ibyte unescape_buffer[64], *unescape_buffer_ptr = unescape_buffer,
+        escaped[MAX_ICHAR_LEN], *unescape_cursor;
+      Bytecount unescape_buffer_size = countof (unescape_buffer),
+        escaped_len = set_itext_ichar (escaped, escapechar);
+      Boolint deleting_escapes, previous_escaped;
+      Ichar pchar;
+
+      while (1)
+        {
+          const Ibyte *p = string, *cursor;
+          deleting_escapes = 0;
+          previous_escaped = 0;
+
+          while (p < end)
+            {
+              pchar = itext_ichar (p);
+
+              if (pchar == sepchar)
+                {
+                  if (!previous_escaped)
+                    {
+                      break;
+                    }
+                }
+              else if (pchar == escapechar
+                       /* Doubled escapes don't escape: */
+                       && !previous_escaped)
+                {
+                  ++deleting_escapes;
+                  previous_escaped = 1;
+                }
+              else
+                {
+                  previous_escaped = 0;
+                }
+
+              INC_IBYTEPTR (p);
+            }
+
+          if (deleting_escapes)
+            {
+              if (((p - string) - (escaped_len * deleting_escapes))
+                  > unescape_buffer_size)
+                {
+                  unescape_buffer_size =
+                    ((p - string) - (escaped_len * deleting_escapes)) * 1.5;
+                  unescape_buffer_ptr = alloca_ibytes (unescape_buffer_size);
+                }
+
+              cursor = string;
+              unescape_cursor = unescape_buffer_ptr;
+              previous_escaped = 0;
+
+              while (cursor < p)
+                {
+                  pchar = itext_ichar (cursor);
+
+                  if (pchar != escapechar || previous_escaped)
+                    {
+                      memcpy (unescape_cursor, cursor,
+                              itext_ichar_len (cursor));
+                      INC_IBYTEPTR (unescape_cursor);
+                    }
+
+                  previous_escaped = !previous_escaped
+                    && (pchar == escapechar);
+
+                  INC_IBYTEPTR (cursor);
+                }
+
+              result = Fcons (make_string (unescape_buffer_ptr,
+                                           unescape_cursor
+                                           - unescape_buffer_ptr),
+                              result);
+            }
+          else
+            {
+              result = Fcons (make_string (string, p - string), result);
+            }
+          if (p < end)
+            {
+              string = p;
+              INC_IBYTEPTR (string);	/* skip sepchar */
+            }
+          else
+            break;
+        }
+    }
+  else
+    {
+      while (1)
+        {
+          const Ibyte *p = string;
+          while (p < end)
+            {
+              if (itext_ichar (p) == sepchar)
+                break;
+              INC_IBYTEPTR (p);
+            }
+          result = Fcons (make_string (string, p - string), result);
+          if (p < end)
+            {
+              string = p;
+              INC_IBYTEPTR (string);	/* skip sepchar */
+            }
+          else
+            break;
+        }
     }
   return Fnreverse (result);
 }
@@ -1102,7 +1200,7 @@
   if (!newlen)
     return Qnil;
 
-  return split_string_by_ichar_1 (newpath, newlen, SEPCHAR);
+  return split_string_by_ichar_1 (newpath, newlen, SEPCHAR, 0, 0);
 }
 
 Lisp_Object
@@ -1115,22 +1213,34 @@
     path = default_;
   if (!path)
     return Qnil;
-  return split_string_by_ichar_1 (path, qxestrlen (path), SEPCHAR);
+  return split_string_by_ichar_1 (path, qxestrlen (path), SEPCHAR, 0, 0);
 }
 
 /* Ben thinks this function should not exist or be exported to Lisp.
    We use it to define split-path-string in subr.el (not!).  */
 
-DEFUN ("split-string-by-char", Fsplit_string_by_char, 2, 2, 0, /*
+DEFUN ("split-string-by-char", Fsplit_string_by_char, 2, 3, 0, /*
 Split STRING into a list of substrings originally separated by SEPCHAR.
+
+With optional ESCAPE-CHAR, any instances of SEPCHAR preceded by that
+character will not split the string, and a double instance of ESCAPE-CHAR
+will be necessary for a single ESCAPE-CHAR to appear in the output string.
 */
-       (string, sepchar))
+       (string, sepchar, escape_char))
 {
+  Ichar escape_ichar = 0;
+
   CHECK_STRING (string);
   CHECK_CHAR (sepchar);
+  if (!NILP (escape_char))
+    {
+      CHECK_CHAR (escape_char);
+      escape_ichar = XCHAR (escape_char);
+    }
   return split_string_by_ichar_1 (XSTRING_DATA (string),
-				   XSTRING_LENGTH (string),
-				   XCHAR (sepchar));
+                                  XSTRING_LENGTH (string),
+                                  XCHAR (sepchar),
+                                  !NILP (escape_char), escape_ichar);
 }
 
 /* #### This was supposed to be in subr.el, but is used VERY early in
@@ -1154,7 +1264,7 @@
 
   return (split_string_by_ichar_1
 	  (XSTRING_DATA (path), XSTRING_LENGTH (path),
-	   itext_ichar (XSTRING_DATA (Vpath_separator))));
+	   itext_ichar (XSTRING_DATA (Vpath_separator)), 0, 0));
 }
 
 
@@ -3231,7 +3341,8 @@
    taking the elements from SEQUENCES.  If VALS is non-NULL, store the
    results into VALS, a C array of Lisp_Objects; else, if LISP_VALS is
    non-nil, store the results into LISP_VALS, a sequence with sufficient
-   room for CALL_COUNT results. Else, do not accumulate any result.
+   room for CALL_COUNT results (but see the documentation of SOME_OR_EVERY.) 
+   Else, do not accumulate any result.
 
    If VALS is non-NULL, NSEQUENCES is one, and SEQUENCES[0] is a cons,
    mapcarX will store the elements of SEQUENCES[0] in stack and GCPRO them,
@@ -3246,11 +3357,10 @@
 
    If SOME_OR_EVERY is SOME_OR_EVERY_SOME, return the (possibly multiple)
    values given by FUNCTION the first time it is non-nil, and abandon the
-   iterations.  LISP_VALS in this case must be an object created by
-   make_opaque_ptr, dereferenced as pointing to a Lisp object. If
-   SOME_OR_EVERY is SOME_OR_EVERY_EVERY, store Qnil at the Lisp_Object
-   pointer address provided by LISP_VALS if FUNCTION gives nil; otherwise
-   leave it alone. */
+   iterations.  LISP_VALS must be a cons, and the return value will be
+   stored in its car.  If SOME_OR_EVERY is SOME_OR_EVERY_EVERY, store Qnil
+   in the car of LISP_VALS if FUNCTION gives nil; otherwise leave it
+   alone. */
 
 #define SOME_OR_EVERY_NEITHER 0
 #define SOME_OR_EVERY_SOME    1
@@ -3306,7 +3416,7 @@
       for (i = 0; i < call_count; ++i)
 	{
 	  args[1] = vals[i];
-	  vals[i] = Ffuncall (nsequences + 1, args);
+	  vals[i] = IGNORE_MULTIPLE_VALUES (Ffuncall (nsequences + 1, args));
 	}
     }
   else
@@ -3413,7 +3523,7 @@
 			break;
 		      }
 
-		    goto bad_show_or_every_flag;
+		    goto bad_some_or_every_flag;
 		  }
 		case lrecord_type_vector:
 		  {
@@ -3443,7 +3553,7 @@
 		      (void) Faset (lisp_vals, make_int (i), called);
 		    break;
 		  }
-		bad_show_or_every_flag:
+		bad_some_or_every_flag:
 		default:
 		  {
 		    ABORT();
--- a/src/syswindows.h	Sat Feb 20 03:46:22 2010 -0600
+++ b/src/syswindows.h	Sat Feb 20 19:04:55 2010 -0600
@@ -572,7 +572,6 @@
    and cause problems if we used Cygwin headers to generate
    intl-auto-encap-win32.[ch]. */
 typedef LPCVOID PCVOID;
-typedef LPDWORD *PDWORD_PTR;
 
 #endif /* CYGWIN_HEADERS */
 
--- a/tests/ChangeLog	Sat Feb 20 03:46:22 2010 -0600
+++ b/tests/ChangeLog	Sat Feb 20 19:04:55 2010 -0600
@@ -1,3 +1,20 @@
+2010-02-19  Aidan Kehoe  <kehoea@parhasard.net>
+
+	* automated/lisp-tests.el:
+	Change the #'split-string-by-char text to use US federal
+	government information instead of a couple of sentences from the
+	OED; the latter would probably have qualified as non-infringement,
+	but with the former the question won't arise.
+	(The German text in the same tests is from a very public domain
+	19th-century work.)
+
+2010-02-19  Aidan Kehoe  <kehoea@parhasard.net>
+
+	* automated/lisp-tests.el:
+	Check that multiple values are discarded correctly with #'mapcar
+	and one SEQUENCE.
+	(equal): 
+
 2010-02-05  Jerry James  <james@xemacs.org>
 
 	* DLL/dltest.c: Remove old test.  Building and using any module now
@@ -268,6 +285,11 @@
 	* automated/mule-tests.el (featurep):
 	Use utf-8 as file-name-coding-system under Cygwin 1.7+.
 
+2010-02-07  Aidan Kehoe  <kehoea@parhasard.net>
+
+	* automated/lisp-tests.el (split-string-by-char):
+	Test this function, and its new ESCAPE-CHAR argument.
+
 2010-01-01  Aidan Kehoe  <kehoea@parhasard.net>
 
 	* automated/lisp-tests.el: 
--- a/tests/automated/lisp-tests.el	Sat Feb 20 03:46:22 2010 -0600
+++ b/tests/automated/lisp-tests.el	Sat Feb 20 19:04:55 2010 -0600
@@ -1,4 +1,4 @@
-;; Copyright (C) 1998 Free Software Foundation, Inc.
+;; Copyright (C) 1998 Free Software Foundation, Inc. -*- coding: iso-8859-1 -*-
 
 ;; Author: Martin Buchholz <martin@xemacs.org>
 ;; Maintainer: Martin Buchholz <martin@xemacs.org>
@@ -973,6 +973,12 @@
       (car y))
     x)))
 
+(Assert-eql
+ (length (multiple-value-list
+          (car (mapcar #'(lambda (argument) (floor argument)) (list pi e)))))
+ 1
+ "checking multiple values are correctly discarded in mapcar")
+
 ;;-----------------------------------------------------
 ;; Test vector functions
 ;;-----------------------------------------------------
@@ -1071,6 +1077,76 @@
 	       '("foobar"))
 
 ;;-----------------------------------------------------
+;; Test split-string-by-char
+;;-----------------------------------------------------
+
+(Assert
+ (equal
+  (split-string-by-char
+   #r"re\:ee:this\\is\\text\\\\:oo\ps:
+Eine Sprache, die stagnirt, ist zu vergleichen mit einem See, dem der
+bisherige Quellenzufluß versiegt oder abgeleitet wird. Aus dem Wasser,
+worüber der Geist Gottes schwebte, wird Sumpf und Moder, worüber die
+unreinen\: Geister brüten.\\
+Serum concentrations of vitamin E: (alpha-tocopherol) depend on the liver,
+which takes up the nutrient after the various forms are absorbed from the
+small intestine. The liver preferentially resecretes only alpha-tocopherol
+via the hepatic alpha-tocopherol transfer protein"
+  ?: ?\\)
+  '("re:ee" "this\\is\\text\\\\" "oops" "
+Eine Sprache, die stagnirt, ist zu vergleichen mit einem See, dem der
+bisherige Quellenzufluß versiegt oder abgeleitet wird. Aus dem Wasser,
+worüber der Geist Gottes schwebte, wird Sumpf und Moder, worüber die
+unreinen: Geister brüten.\\
+Serum concentrations of vitamin E" " (alpha-tocopherol) depend on the liver,
+which takes up the nutrient after the various forms are absorbed from the
+small intestine. The liver preferentially resecretes only alpha-tocopherol
+via the hepatic alpha-tocopherol transfer protein")))
+(Assert
+ (equal
+  (split-string-by-char
+   #r"re\:ee:this\\is\\text\\\\:oo\ps:
+Eine Sprache, die stagnirt, ist zu vergleichen mit einem See, dem der
+bisherige Quellenzufluß versiegt oder abgeleitet wird. Aus dem Wasser,
+worüber der Geist Gottes schwebte, wird Sumpf und Moder, worüber die
+unreinen\: Geister brüten.\\
+Serum concentrations of vitamin E: (alpha-tocopherol) depend on the liver,
+which takes up the nutrient after the various forms are absorbed from the
+small intestine. The liver preferentially resecretes only alpha-tocopherol
+via the hepatic alpha-tocopherol transfer protein"
+   ?: ?\x00)
+  '("re\\" "ee" "this\\\\is\\\\text\\\\\\\\" "oo\\ps" "
+Eine Sprache, die stagnirt, ist zu vergleichen mit einem See, dem der
+bisherige Quellenzufluß versiegt oder abgeleitet wird. Aus dem Wasser,
+worüber der Geist Gottes schwebte, wird Sumpf und Moder, worüber die
+unreinen\\" " Geister brüten.\\\\
+Serum concentrations of vitamin E" " (alpha-tocopherol) depend on the liver,
+which takes up the nutrient after the various forms are absorbed from the
+small intestine. The liver preferentially resecretes only alpha-tocopherol
+via the hepatic alpha-tocopherol transfer protein")))
+(Assert
+ (equal
+  (split-string-by-char
+   #r"re\:ee:this\\is\\text\\\\:oo\ps:
+Eine Sprache, die stagnirt, ist zu vergleichen mit einem See, dem der
+bisherige Quellenzufluß versiegt oder abgeleitet wird. Aus dem Wasser,
+worüber der Geist Gottes schwebte, wird Sumpf und Moder, worüber die
+unreinen\: Geister brüten.\\
+Serum concentrations of vitamin E: (alpha-tocopherol) depend on the liver,
+which takes up the nutrient after the various forms are absorbed from the
+small intestine. The liver preferentially resecretes only alpha-tocopherol
+via the hepatic alpha-tocopherol transfer protein" ?\\)
+  '("re" ":ee:this" "" "is" "" "text" "" "" "" ":oo" "ps:
+Eine Sprache, die stagnirt, ist zu vergleichen mit einem See, dem der
+bisherige Quellenzufluß versiegt oder abgeleitet wird. Aus dem Wasser,
+worüber der Geist Gottes schwebte, wird Sumpf und Moder, worüber die
+unreinen" ": Geister brüten." "" "
+Serum concentrations of vitamin E: (alpha-tocopherol) depend on the liver,
+which takes up the nutrient after the various forms are absorbed from the
+small intestine. The liver preferentially resecretes only alpha-tocopherol
+via the hepatic alpha-tocopherol transfer protein")))
+
+;;-----------------------------------------------------
 ;; Test near-text buffer functions.
 ;;-----------------------------------------------------
 (with-temp-buffer