Mercurial > emacs
comparison src/casefiddle.c @ 90534:2811bff46a36
(casify_object): Sync with HEAD.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Thu, 20 Jul 2006 12:09:16 +0000 |
parents | c5406394f567 |
children | c358d0861b16 |
comparison
equal
deleted
inserted
replaced
90533:8a8e69664178 | 90534:2811bff46a36 |
---|---|
43 | 43 |
44 /* If the case table is flagged as modified, rescan it. */ | 44 /* If the case table is flagged as modified, rescan it. */ |
45 if (NILP (XCHAR_TABLE (current_buffer->downcase_table)->extras[1])) | 45 if (NILP (XCHAR_TABLE (current_buffer->downcase_table)->extras[1])) |
46 Fset_case_table (current_buffer->downcase_table); | 46 Fset_case_table (current_buffer->downcase_table); |
47 | 47 |
48 while (1) | 48 if (INTEGERP (obj)) |
49 { | 49 { |
50 if (INTEGERP (obj)) | 50 int flagbits = (CHAR_ALT | CHAR_SUPER | CHAR_HYPER |
51 | CHAR_SHIFT | CHAR_CTL | CHAR_META); | |
52 int flags = XINT (obj) & flagbits; | |
53 int multibyte = ! NILP (current_buffer->enable_multibyte_characters); | |
54 | |
55 /* If the character has higher bits set | |
56 above the flags, return it unchanged. | |
57 It is not a real character. */ | |
58 if ((unsigned) XFASTINT (obj) > (unsigned) flagbits) | |
59 return obj; | |
60 | |
61 c1 = XFASTINT (obj) & ~flagbits; | |
62 if (! multibyte) | |
63 MAKE_CHAR_MULTIBYTE (c1); | |
64 c = DOWNCASE (c1); | |
65 if (inword) | |
66 XSETFASTINT (obj, c | flags); | |
67 else if (c == (XFASTINT (obj) & ~flagbits)) | |
51 { | 68 { |
52 int flagbits = (CHAR_ALT | CHAR_SUPER | CHAR_HYPER | 69 if (! inword) |
53 | CHAR_SHIFT | CHAR_CTL | CHAR_META); | 70 c = UPCASE1 (c1); |
54 int flags = XINT (obj) & flagbits; | |
55 int multibyte = ! NILP (current_buffer->enable_multibyte_characters); | |
56 | |
57 /* If the character has higher bits set | |
58 above the flags, return it unchanged. | |
59 It is not a real character. */ | |
60 if ((unsigned) XFASTINT (obj) > (unsigned) flagbits) | |
61 return obj; | |
62 | |
63 c1 = XFASTINT (obj) & ~flagbits; | |
64 if (! multibyte) | 71 if (! multibyte) |
65 MAKE_CHAR_MULTIBYTE (c1); | 72 MAKE_CHAR_UNIBYTE (c); |
66 c = DOWNCASE (c1); | 73 XSETFASTINT (obj, c | flags); |
67 if (inword) | 74 } |
68 XSETFASTINT (obj, c | flags); | 75 return obj; |
69 else if (c == (XFASTINT (obj) & ~flagbits)) | 76 } |
77 | |
78 if (STRINGP (obj)) | |
79 { | |
80 int multibyte = STRING_MULTIBYTE (obj); | |
81 int i, i_byte, len; | |
82 int size = SCHARS (obj); | |
83 | |
84 obj = Fcopy_sequence (obj); | |
85 for (i = i_byte = 0; i < size; i++, i_byte += len) | |
86 { | |
87 if (multibyte) | |
88 c = STRING_CHAR_AND_LENGTH (SDATA (obj) + i_byte, 0, len); | |
89 else | |
70 { | 90 { |
71 if (! inword) | 91 c = SREF (obj, i_byte); |
72 c = UPCASE1 (c1); | 92 len = 1; |
93 MAKE_CHAR_MULTIBYTE (c); | |
94 } | |
95 c1 = c; | |
96 if (inword && flag != CASE_CAPITALIZE_UP) | |
97 c = DOWNCASE (c); | |
98 else if (!UPPERCASEP (c) | |
99 && (!inword || flag != CASE_CAPITALIZE_UP)) | |
100 c = UPCASE1 (c1); | |
101 if ((int) flag >= (int) CASE_CAPITALIZE) | |
102 inword = (SYNTAX (c) == Sword); | |
103 if (c != c1) | |
104 { | |
73 if (! multibyte) | 105 if (! multibyte) |
74 MAKE_CHAR_UNIBYTE (c); | 106 { |
75 XSETFASTINT (obj, c | flags); | 107 MAKE_CHAR_UNIBYTE (c); |
76 } | 108 SSET (obj, i_byte, c); |
77 return obj; | 109 } |
78 } | 110 else if (ASCII_CHAR_P (c1) && ASCII_CHAR_P (c)) |
79 | 111 SSET (obj, i_byte, c); |
80 if (STRINGP (obj)) | |
81 { | |
82 int multibyte = STRING_MULTIBYTE (obj); | |
83 int i, i_byte, len; | |
84 int size = SCHARS (obj); | |
85 | |
86 obj = Fcopy_sequence (obj); | |
87 for (i = i_byte = 0; i < size; i++, i_byte += len) | |
88 { | |
89 if (multibyte) | |
90 c = STRING_CHAR_AND_LENGTH (SDATA (obj) + i_byte, 0, len); | |
91 else | 112 else |
92 { | 113 { |
93 c = SREF (obj, i_byte); | 114 Faset (obj, make_number (i), make_number (c)); |
94 len = 1; | 115 i_byte += CHAR_BYTES (c) - len; |
95 MAKE_CHAR_MULTIBYTE (c); | |
96 } | |
97 c1 = c; | |
98 if (inword && flag != CASE_CAPITALIZE_UP) | |
99 c = DOWNCASE (c); | |
100 else if (!UPPERCASEP (c) | |
101 && (!inword || flag != CASE_CAPITALIZE_UP)) | |
102 c = UPCASE1 (c1); | |
103 if ((int) flag >= (int) CASE_CAPITALIZE) | |
104 inword = (SYNTAX (c) == Sword); | |
105 if (c != c1) | |
106 { | |
107 if (! multibyte) | |
108 { | |
109 MAKE_CHAR_UNIBYTE (c); | |
110 SSET (obj, i_byte, c); | |
111 } | |
112 else if (ASCII_CHAR_P (c1) && ASCII_CHAR_P (c)) | |
113 SSET (obj, i_byte, c); | |
114 else | |
115 { | |
116 Faset (obj, make_number (i), make_number (c)); | |
117 i_byte += CHAR_BYTES (c) - len; | |
118 } | |
119 } | 116 } |
120 } | 117 } |
121 return obj; | |
122 } | 118 } |
123 obj = wrong_type_argument (Qchar_or_string_p, obj); | 119 return obj; |
124 } | 120 } |
121 | |
122 wrong_type_argument (Qchar_or_string_p, obj); | |
125 } | 123 } |
126 | 124 |
127 DEFUN ("upcase", Fupcase, Supcase, 1, 1, 0, | 125 DEFUN ("upcase", Fupcase, Supcase, 1, 1, 0, |
128 doc: /* Convert argument to upper case and return that. | 126 doc: /* Convert argument to upper case and return that. |
129 The argument may be a character or string. The result has the same type. | 127 The argument may be a character or string. The result has the same type. |