aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenichi Handa2006-07-20 12:09:16 +0000
committerKenichi Handa2006-07-20 12:09:16 +0000
commit0d64f689595195a896eb9fdb433ce9b337c14518 (patch)
tree62791ea518b4add6a62f4b7dcb499fa5de395393
parent63db3c1b3ffa669435b10aa362115ef664990ab2 (diff)
downloademacs-0d64f689595195a896eb9fdb433ce9b337c14518.tar.gz
emacs-0d64f689595195a896eb9fdb433ce9b337c14518.zip
(casify_object): Sync with HEAD.
-rw-r--r--src/casefiddle.c124
1 files changed, 61 insertions, 63 deletions
diff --git a/src/casefiddle.c b/src/casefiddle.c
index ba9b3e3adf4..8eb3cc69fca 100644
--- a/src/casefiddle.c
+++ b/src/casefiddle.c
@@ -45,83 +45,81 @@ casify_object (flag, obj)
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)
68 XSETFASTINT (obj, c | flags);
69 else if (c == (XFASTINT (obj) & ~flagbits))
70 {
71 if (! inword)
72 c = UPCASE1 (c1);
73 if (! multibyte)
74 MAKE_CHAR_UNIBYTE (c);
75 XSETFASTINT (obj, c | flags);
76 }
77 return obj;
78 } 74 }
75 return obj;
76 }
79 77
80 if (STRINGP (obj)) 78 if (STRINGP (obj))
81 { 79 {
82 int multibyte = STRING_MULTIBYTE (obj); 80 int multibyte = STRING_MULTIBYTE (obj);
83 int i, i_byte, len; 81 int i, i_byte, len;
84 int size = SCHARS (obj); 82 int size = SCHARS (obj);
85 83
86 obj = Fcopy_sequence (obj); 84 obj = Fcopy_sequence (obj);
87 for (i = i_byte = 0; i < size; i++, i_byte += len) 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
88 { 90 {
89 if (multibyte) 91 c = SREF (obj, i_byte);
90 c = STRING_CHAR_AND_LENGTH (SDATA (obj) + i_byte, 0, len); 92 len = 1;
91 else 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 {
105 if (! multibyte)
92 { 106 {
93 c = SREF (obj, i_byte); 107 MAKE_CHAR_UNIBYTE (c);
94 len = 1; 108 SSET (obj, i_byte, c);
95 MAKE_CHAR_MULTIBYTE (c);
96 } 109 }
97 c1 = c; 110 else if (ASCII_CHAR_P (c1) && ASCII_CHAR_P (c))
98 if (inword && flag != CASE_CAPITALIZE_UP) 111 SSET (obj, i_byte, c);
99 c = DOWNCASE (c); 112 else
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 { 113 {
107 if (! multibyte) 114 Faset (obj, make_number (i), make_number (c));
108 { 115 i_byte += CHAR_BYTES (c) - len;
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
127DEFUN ("upcase", Fupcase, Supcase, 1, 1, 0, 125DEFUN ("upcase", Fupcase, Supcase, 1, 1, 0,