summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Colascione <dancol@dancol.org>2012-10-29 09:24:29 -0800
committerDaniel Colascione <dancol@dancol.org>2012-10-29 09:24:29 -0800
commitba11600816880f862a7a85899bfa3dc41c176273 (patch)
tree18f4f2ed554b2e93a1d2588a25e7df1d9339fbde /src
parentd7f9cc85284bc159166d1c600100b0080bfad494 (diff)
downloademacs-ba11600816880f862a7a85899bfa3dc41c176273.tar.gz
2012-10-29 Daniel Colascione <dancol@dancol.org>
cygw32.h, cygw32.c (Qutf_16le, from_unicode, to_unicode): In preparation for fixing bug#12739, move these functions from here... * coding.h, coding.c: ... to here, and compile them only when WINDOWSNT or HAVE_NTGUI. Moving these functions out of cygw32 proper lets us write cygw32-agnostic code for the HAVE_NTGUI case.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog10
-rw-r--r--src/coding.c42
-rw-r--r--src/coding.h22
-rw-r--r--src/cygw32.c33
-rw-r--r--src/cygw32.h14
5 files changed, 74 insertions, 47 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index beec867d333..c76bbb5a260 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,13 @@
+2012-10-29 Daniel Colascione <dancol@dancol.org>
+
+ * cygw32.h, cygw32.c (Qutf_16le, from_unicode, to_unicode): In
+ preparation for fixing bug#12739, move these functions from
+ here...
+
+ * coding.h, coding.c: ... to here, and compile them only when
+ WINDOWSNT or HAVE_NTGUI. Moving these functions out of cygw32
+ proper lets us write cygw32-agnostic code for the HAVE_NTGUI case.
+
2012-10-28 Eli Zaretskii <eliz@gnu.org>
* w32proc.c (TIMER_TICKS_PER_SEC): New macro.
diff --git a/src/coding.c b/src/coding.c
index 7628a9fbf2e..611f92ea152 100644
--- a/src/coding.c
+++ b/src/coding.c
@@ -343,6 +343,10 @@ Lisp_Object Qcoding_system_p, Qcoding_system_error;
Lisp_Object Qemacs_mule, Qraw_text;
Lisp_Object Qutf_8_emacs;
+#if defined (WINDOWSNT) || defined (HAVE_NTGUI)
+static Lisp_Object Qutf_16le;
+#endif
+
/* Coding-systems are handed between Emacs Lisp programs and C internal
routines by the following three variables. */
/* Coding system to be used to encode text for terminal display when
@@ -7971,6 +7975,39 @@ preferred_coding_system (void)
return CODING_ID_NAME (id);
}
+#if defined (WINDOWSNT) || defined (HAVE_NTGUI)
+
+Lisp_Object
+from_unicode (Lisp_Object str)
+{
+ CHECK_STRING (str);
+ if (!STRING_MULTIBYTE (str) &&
+ SBYTES (str) & 1)
+ {
+ str = Fsubstring (str, make_number (0), make_number (-1));
+ }
+
+ return code_convert_string_norecord (str, Qutf_16le, 0);
+}
+
+wchar_t *
+to_unicode (Lisp_Object str, Lisp_Object *buf)
+{
+ *buf = code_convert_string_norecord (str, Qutf_16le, 1);
+ /* We need to make a another copy (in addition to the one made by
+ code_convert_string_norecord) to ensure that the final string is
+ _doubly_ zero terminated --- that is, that the string is
+ terminated by two zero bytes and one utf-16le null character.
+ Because strings are already terminated with a single zero byte,
+ we just add one additional zero. */
+ str = make_uninit_string (SBYTES (*buf) + 1);
+ memcpy (SDATA (str), SDATA (*buf), SBYTES (*buf));
+ SDATA (str) [SBYTES (*buf)] = '\0';
+ *buf = str;
+ return WCSDATA (*buf);
+}
+#endif /* WINDOWSNT || HAVE_NTGUI */
+
#ifdef emacs
/*** 8. Emacs Lisp library functions ***/
@@ -10284,6 +10321,11 @@ syms_of_coding (void)
DEFSYM (Qutf_8, "utf-8");
DEFSYM (Qutf_8_emacs, "utf-8-emacs");
+#if defined (WINDOWSNT) || defined (HAVE_NTGUI)
+ /* No, not utf-16-le: that one has a BOM. */
+ DEFSYM (Qutf_16le, "utf-16le");
+#endif
+
DEFSYM (Qutf_16, "utf-16");
DEFSYM (Qbig, "big");
DEFSYM (Qlittle, "little");
diff --git a/src/coding.h b/src/coding.h
index 989552bf667..6ba5f8e0e1e 100644
--- a/src/coding.h
+++ b/src/coding.h
@@ -701,6 +701,28 @@ extern void encode_coding_object (struct coding_system *,
Lisp_Object, ptrdiff_t, ptrdiff_t,
ptrdiff_t, ptrdiff_t, Lisp_Object);
+#if defined (WINDOWSNT) || defined (HAVE_NTGUI)
+
+/* These functions use Lisp string objects to store the UTF-16LE
+ strings that modern versions of Windows expect. These strings are
+ not particularly useful to Lisp, and all Lisp strings should be
+ native Emacs multibyte. */
+
+/* Access the wide-character string stored in a Lisp string object. */
+#define WCSDATA(x) ((wchar_t *) SDATA (x))
+
+/* Convert the multi-byte string in STR to UTF-16LE encoded unibyte
+ string, and store it in *BUF. BUF may safely point to STR on entry. */
+extern wchar_t *to_unicode (Lisp_Object str, Lisp_Object *buf);
+
+/* Convert STR, a UTF-16LE encoded string embedded in a unibyte string
+ object, to a multi-byte Emacs string and return it. This function
+ calls code_convert_string_norecord internally and has all its
+ failure modes. STR itself is not modified. */
+extern Lisp_Object from_unicode (Lisp_Object str);
+
+#endif /* WINDOWSNT || HAVE_NTGUI */
+
/* Macros for backward compatibility. */
#define decode_coding_region(coding, from, to) \
diff --git a/src/cygw32.c b/src/cygw32.c
index 8f63461da2a..54f2076a891 100644
--- a/src/cygw32.c
+++ b/src/cygw32.c
@@ -22,7 +22,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#include "buffer.h"
#include <unistd.h>
#include <fcntl.h>
-static Lisp_Object Qutf_16le;
static Lisp_Object
fchdir_unwind (Lisp_Object dir_fd)
@@ -107,36 +106,6 @@ conv_filename_from_w32_unicode (const wchar_t* in, int absolute_p)
return unbind_to (count, DECODE_FILE (converted));
}
-Lisp_Object
-from_unicode (Lisp_Object str)
-{
- CHECK_STRING (str);
- if (!STRING_MULTIBYTE (str) &&
- SBYTES (str) & 1)
- {
- str = Fsubstring (str, make_number (0), make_number (-1));
- }
-
- return code_convert_string_norecord (str, Qutf_16le, 0);
-}
-
-wchar_t *
-to_unicode (Lisp_Object str, Lisp_Object *buf)
-{
- *buf = code_convert_string_norecord (str, Qutf_16le, 1);
- /* We need to make a another copy (in addition to the one made by
- code_convert_string_norecord) to ensure that the final string is
- _doubly_ zero terminated --- that is, that the string is
- terminated by two zero bytes and one utf-16le null character.
- Because strings are already terminated with a single zero byte,
- we just add one additional zero. */
- str = make_uninit_string (SBYTES (*buf) + 1);
- memcpy (SDATA (str), SDATA (*buf), SBYTES (*buf));
- SDATA (str) [SBYTES (*buf)] = '\0';
- *buf = str;
- return WCSDATA (*buf);
-}
-
DEFUN ("cygwin-convert-path-to-windows",
Fcygwin_convert_path_to_windows, Scygwin_convert_path_to_windows,
1, 2, 0,
@@ -162,8 +131,6 @@ DEFUN ("cygwin-convert-path-from-windows",
void
syms_of_cygw32 (void)
{
- /* No, not utf-16-le: that one has a BOM. */
- DEFSYM (Qutf_16le, "utf-16le");
defsubr (&Scygwin_convert_path_from_windows);
defsubr (&Scygwin_convert_path_to_windows);
}
diff --git a/src/cygw32.h b/src/cygw32.h
index 78e77a9a141..51571913fd1 100644
--- a/src/cygw32.h
+++ b/src/cygw32.h
@@ -33,20 +33,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#include "lisp.h"
#include "coding.h"
-/* *** Character conversion *** */
-
-/* Access the wide-character string stored in a Lisp string object. */
-#define WCSDATA(x) ((wchar_t *) SDATA (x))
-
-/* Convert the multi-byte string in STR to UTF-16LE encoded unibyte
- string, and store it in *BUF. BUF may safely point to STR on entry. */
-extern wchar_t *to_unicode (Lisp_Object str, Lisp_Object *buf);
-
-/* Convert STR, a UTF-16LE encoded string embedded in a unibyte string
- object, to a multi-byte Emacs string, and return it. */
-extern Lisp_Object from_unicode (Lisp_Object str);
-
-/* *** Misc *** */
extern void syms_of_cygw32 (void);
extern char * w32_strerror (int error_no);