diff options
| author | Michal Nazarewicz | 2016-09-07 21:00:57 +0200 |
|---|---|---|
| committer | Michal Nazarewicz | 2017-02-15 16:54:07 +0100 |
| commit | 6220faeb4e9be16b9dec728e72ea8dff2cfe35ba (patch) | |
| tree | d329bc3c65eb858ea8f03a2705ea5de696abac05 /src/buffer.h | |
| parent | 5ec3a58462e99533ea5200de356302181d634d0b (diff) | |
| download | emacs-6220faeb4e9be16b9dec728e72ea8dff2cfe35ba.tar.gz emacs-6220faeb4e9be16b9dec728e72ea8dff2cfe35ba.zip | |
casing: don’t assume letters are *either* upper- or lower-case (bug#24603)
A compatibility digraph characters, such as Dž, are neither upper- nor
lower-case. At the moment however, those are reported as upper-case¹
despite the fact that they change when upper-cased.
Stop checking if a character is upper-case before trying to up-case it
so that title-case characters are handled correctly. This fixes one of
the issues mentioned in bug#24603.
¹ Because they change when converted to lower-case. Notice an asymmetry
in that for a character to be considered lower-case it must not be
upper-case (plus the usual condition of changing when upper-cased).
* src/buffer.h (upcase1): Delete.
(upcase): Change to upcase character unconditionally just like downcase
does it. This is what upcase1 was.
* src/casefiddle.c (casify_object, casify_region): Use upcase instead
of upcase1 and don’t check !uppercasep(x) before calling upcase.
* src/keyboard.c (read_key_sequence): Don’t check if uppercase(x), just
downcase(x) and see if it changed.
* test/src/casefiddle-tests.el (casefiddle-tests--characters,
casefiddle-tests-casing): Update test cases which are now passing.
Diffstat (limited to 'src/buffer.h')
| -rw-r--r-- | src/buffer.h | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/src/buffer.h b/src/buffer.h index 4a23e4fdd2e..f53212e3120 100644 --- a/src/buffer.h +++ b/src/buffer.h | |||
| @@ -1365,28 +1365,28 @@ downcase (int c) | |||
| 1365 | return NATNUMP (down) ? XFASTINT (down) : c; | 1365 | return NATNUMP (down) ? XFASTINT (down) : c; |
| 1366 | } | 1366 | } |
| 1367 | 1367 | ||
| 1368 | /* True if C is upper case. */ | 1368 | /* Upcase a character C, or make no change if that cannot be done. */ |
| 1369 | INLINE bool uppercasep (int c) { return downcase (c) != c; } | ||
| 1370 | |||
| 1371 | /* Upcase a character C known to be not upper case. */ | ||
| 1372 | INLINE int | 1369 | INLINE int |
| 1373 | upcase1 (int c) | 1370 | upcase (int c) |
| 1374 | { | 1371 | { |
| 1375 | Lisp_Object upcase_table = BVAR (current_buffer, upcase_table); | 1372 | Lisp_Object upcase_table = BVAR (current_buffer, upcase_table); |
| 1376 | Lisp_Object up = CHAR_TABLE_REF (upcase_table, c); | 1373 | Lisp_Object up = CHAR_TABLE_REF (upcase_table, c); |
| 1377 | return NATNUMP (up) ? XFASTINT (up) : c; | 1374 | return NATNUMP (up) ? XFASTINT (up) : c; |
| 1378 | } | 1375 | } |
| 1379 | 1376 | ||
| 1377 | /* True if C is upper case. */ | ||
| 1378 | INLINE bool uppercasep (int c) | ||
| 1379 | { | ||
| 1380 | return downcase (c) != c; | ||
| 1381 | } | ||
| 1382 | |||
| 1380 | /* True if C is lower case. */ | 1383 | /* True if C is lower case. */ |
| 1381 | INLINE bool | 1384 | INLINE bool |
| 1382 | lowercasep (int c) | 1385 | lowercasep (int c) |
| 1383 | { | 1386 | { |
| 1384 | return !uppercasep (c) && upcase1 (c) != c; | 1387 | return !uppercasep (c) && upcase (c) != c; |
| 1385 | } | 1388 | } |
| 1386 | 1389 | ||
| 1387 | /* Upcase a character C, or make no change if that cannot be done. */ | ||
| 1388 | INLINE int upcase (int c) { return uppercasep (c) ? c : upcase1 (c); } | ||
| 1389 | |||
| 1390 | INLINE_HEADER_END | 1390 | INLINE_HEADER_END |
| 1391 | 1391 | ||
| 1392 | #endif /* EMACS_BUFFER_H */ | 1392 | #endif /* EMACS_BUFFER_H */ |