(Fget_byte): New function.
authorKenichi Handa <handa@m17n.org>
Sat, 8 Nov 2008 13:02:38 +0000 (13:02 +0000)
committerKenichi Handa <handa@m17n.org>
Sat, 8 Nov 2008 13:02:38 +0000 (13:02 +0000)
(syms_of_character): Defsubr Fget_byte.

src/ChangeLog
src/character.c

index 7c8d432..9e81d0a 100644 (file)
@@ -1,3 +1,8 @@
+2008-11-08  Kenichi Handa  <handa@m17n.org>
+
+       * character.c (Fget_byte): New function.
+       (syms_of_character): Defsubr Fget_byte.
+
 2008-11-07  Chong Yidong  <cyd@stupidchicken.com>
 
        * xdisp.c (try_window_reusing_current_matrix): Ensure that window
index c237d8f..38d4f6a 100644 (file)
@@ -1027,6 +1027,63 @@ usage: (char-resolve-modifiers CHAR)  */)
   return make_number (char_resolve_modifier_mask (c));
 }
 
+DEFUN ("get-byte", Fget_byte, Sget_byte, 0, 2, 0,
+       doc: /* Return a byte value of a character at point.
+Optional 1st arg POSITION, if non-nil, is a position of a character to get
+a byte value.
+Optional 2nd arg STRING, if non-nil, is a string of which first
+character is a target to get a byte value.  In this case, POSITION, if
+non-nil, is an index of a target character in the string.
+
+If the current buffer (or STRING) is multibyte, and the target
+character is not ASCII nor 8-bit character, an error is signalled.  */)
+     (position, string)
+     Lisp_Object position, string;
+{
+  int c;
+  EMACS_INT pos;
+  unsigned char *p;
+
+  if (NILP (string))
+    {
+      if (NILP (position))
+       {
+         p = PT_ADDR;
+       }         
+      else
+       {
+         CHECK_NUMBER_COERCE_MARKER (position);
+         if (XINT (position) < BEGV || XINT (position) >= ZV)
+           args_out_of_range_3 (position, make_number (BEGV), make_number (ZV));
+         pos = XFASTINT (position);
+         p = CHAR_POS_ADDR (pos);
+       }
+    }
+  else
+    {
+      CHECK_STRING (string);
+      if (NILP (position))
+       {
+         p = SDATA (string);
+       }
+      else
+       {
+         CHECK_NATNUM (position);
+         if (XINT (position) >= SCHARS (string))
+           args_out_of_range (string, position);
+         pos = XFASTINT (position);
+         p = SDATA (string) + string_char_to_byte (string, pos);
+       }
+    }
+  c = STRING_CHAR (p, 0);
+  if (CHAR_BYTE8_P (c))
+    c = CHAR_TO_BYTE8 (c);
+  else if (! ASCII_CHAR_P (c))
+    error ("Not an ASCII nor an 8-bit character: %d", c);
+  return make_number (c);
+}
+
+
 void
 init_character_once ()
 {
@@ -1054,6 +1111,7 @@ syms_of_character ()
   defsubr (&Sstring);
   defsubr (&Sunibyte_string);
   defsubr (&Schar_resolve_modifiers);
+  defsubr (&Sget_byte);
 
   DEFVAR_LISP ("translation-table-vector",  &Vtranslation_table_vector,
               doc: /*