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.