/* GNU Emacs case conversion functions.
- Copyright (C) 1985, 1994 Free Software Foundation, Inc.
+ Copyright (C) 1985, 1994, 1997 Free Software Foundation, Inc.
This file is part of GNU Emacs.
{
register int i, c, len;
register int inword = flag == CASE_DOWN;
- Lisp_Object tem;
/* If the case table is flagged as modified, rescan it. */
if (NILP (XCHAR_TABLE (current_buffer->downcase_table)->extras[1]))
{
if (INTEGERP (obj))
{
- c = DOWNCASE (XFASTINT (obj));
+ int flagbits = (CHAR_ALT | CHAR_SUPER | CHAR_HYPER
+ | CHAR_SHIFT | CHAR_CTL | CHAR_META);
+ int flags = XINT (obj) & flagbits;
+
+ c = DOWNCASE (XFASTINT (obj) & ~flagbits);
if (inword)
- XSETFASTINT (obj, c);
- else if (c == XFASTINT (obj))
+ XSETFASTINT (obj, c | flags);
+ else if (c == (XFASTINT (obj) & ~flagbits))
{
- c = UPCASE1 (XFASTINT (obj));
- XSETFASTINT (obj, c);
+ c = UPCASE1 ((XFASTINT (obj) & ~flagbits));
+ XSETFASTINT (obj, c | flags);
}
return obj;
}
int multibyte = STRING_MULTIBYTE (obj);
obj = Fcopy_sequence (obj);
- len = XSTRING (obj)->size_byte;
+ len = STRING_BYTES (XSTRING (obj));
/* Scan all single-byte characters from start of string. */
for (i = 0; i < len;)
{
/* The work is not yet finished because of a multibyte
character just encountered. */
- int fromlen, tolen, j = i, j_byte = i;
+ int fromlen, tolen, j_byte = i;
char *buf
= (char *) alloca ((len - i) * MAX_LENGTH_OF_MULTI_BYTE_FORM
+ i);
tolen = CHAR_STRING (c, workbuf, str);
bcopy (str, buf + j_byte, tolen);
i += fromlen;
- j++;
j_byte += tolen;
if ((int) flag >= (int) CASE_CAPITALIZE)
inword = SYNTAX (c) == Sword;
}
- obj = make_multibyte_string (buf, j, j_byte);
+ obj = make_multibyte_string (buf, XSTRING (obj)->size,
+ j_byte);
}
return obj;
}
/* flag is CASE_UP, CASE_DOWN or CASE_CAPITALIZE or CASE_CAPITALIZE_UP.
b and e specify range of buffer to operate on. */
+void
casify_region (flag, b, e)
enum case_action flag;
Lisp_Object b, e;
register int multibyte = !NILP (current_buffer->enable_multibyte_characters);
int start, end;
int start_byte, end_byte;
- Lisp_Object ch, downch, val;
if (EQ (b, e))
/* Not modifying because nothing marked */
return Qnil;
}
\f
+void
syms_of_casefiddle ()
{
Qidentity = intern ("identity");
defsubr (&Scapitalize_word);
}
+void
keys_of_casefiddle ()
{
initial_define_key (control_x_map, Ctl('U'), "upcase-region");