/* Basic character support.
-Copyright (C) 2001-2013 Free Software Foundation, Inc.
+Copyright (C) 2001-2015 Free Software Foundation, Inc.
Copyright (C) 1995, 1997, 1998, 2001 Electrotechnical Laboratory, JAPAN.
Licensed to the Free Software Foundation.
Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
#include <config.h>
#endif
-#define CHARACTER_INLINE EXTERN_INLINE
-
#include <stdio.h>
#ifdef emacs
#endif /* emacs */
-Lisp_Object Qcharacterp;
-
-static Lisp_Object Qauto_fill_chars;
-
/* Char-table of information about which character to unify to which
Unicode character. Mainly used by the macro MAYBE_UNIFY_CHAR. */
Lisp_Object Vchar_unify_table;
-static Lisp_Object Qchar_script_table;
-
\f
/* If character code C has modifier masks, reflect them to the
if (*p < 0x80 || ! (*p & 0x20) || ! (*p & 0x10))
{
+ /* 1-, 2-, and 3-byte sequences can be handled by the macro. */
c = STRING_CHAR_ADVANCE (p);
}
else if (! (*p & 0x08))
{
- c = ((((p)[0] & 0xF) << 18)
+ /* A 4-byte sequence of this form:
+ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */
+ c = ((((p)[0] & 0x7) << 18)
| (((p)[1] & 0x3F) << 12)
| (((p)[2] & 0x3F) << 6)
| ((p)[3] & 0x3F));
}
else
{
- c = ((((p)[1] & 0x3F) << 18)
+ /* A 5-byte sequence of this form:
+
+ 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
+
+ Note that the top 4 `x's are always 0, so shifting p[1] can
+ never exceed the maximum valid character codepoint. */
+ c = (/* (((p)[0] & 0x3) << 24) ... always 0, so no need to shift. */
+ (((p)[1] & 0x3F) << 18)
| (((p)[2] & 0x3F) << 12)
| (((p)[3] & 0x3F) << 6)
| ((p)[4] & 0x3F));
return c;
}
-/* Convert ASCII or 8-bit character C to unibyte. If C is none of
- them, return (C & 0xFF). */
-
-int
-multibyte_char_to_unibyte (int c)
-{
- if (c < 0x80)
- return c;
- if (CHAR_BYTE8_P (c))
- return CHAR_TO_BYTE8 (c);
- return (c & 0xFF);
-}
-
-/* Like multibyte_char_to_unibyte, but return -1 if C is not supported
- by charset_unibyte. */
-
-int
-multibyte_char_to_unibyte_safe (int c)
-{
- if (c < 0x80)
- return c;
- if (CHAR_BYTE8_P (c))
- return CHAR_TO_BYTE8 (c);
- return -1;
-}
-
DEFUN ("characterp", Fcharacterp, Scharacterp, 1, 2, 0,
doc: /* Return non-nil if OBJECT is a character.
In Emacs Lisp, characters are represented by character codes, which
if (multibyte)
{
- if (byte8_count > (MOST_POSITIVE_FIXNUM - nchars) / 3
- || byte8_count > (STRING_BYTES_BOUND - nbytes) / 2)
+ if ((MOST_POSITIVE_FIXNUM - nchars) / 3 < byte8_count
+ || (STRING_BYTES_BOUND - nbytes) / 2 < byte8_count)
string_overflow ();
/* Convert 2-byte sequence of byte8 chars to 4-byte octal. */
}
else
{
- if (byte8_count > (STRING_BYTES_BOUND - nbytes) / 3)
+ if ((STRING_BYTES_BOUND - nbytes) / 3 < byte8_count)
string_overflow ();
/* Convert 1-byte sequence of byte8 chars to 4-byte octal. */
doc: /* Char table of script symbols.
It has one extra slot whose value is a list of script symbols. */);
- /* Intern this now in case it isn't already done.
- Setting this variable twice is harmless.
- But don't staticpro it here--that is done in alloc.c. */
- Qchar_table_extra_slots = intern_c_string ("char-table-extra-slots");
DEFSYM (Qchar_script_table, "char-script-table");
Fput (Qchar_script_table, Qchar_table_extra_slots, make_number (1));
Vchar_script_table = Fmake_char_table (Qchar_script_table, Qnil);