aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.h
diff options
context:
space:
mode:
authorMichal Nazarewicz2016-09-07 21:00:57 +0200
committerMichal Nazarewicz2017-02-15 16:54:07 +0100
commit6220faeb4e9be16b9dec728e72ea8dff2cfe35ba (patch)
treed329bc3c65eb858ea8f03a2705ea5de696abac05 /src/buffer.h
parent5ec3a58462e99533ea5200de356302181d634d0b (diff)
downloademacs-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.h18
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. */
1369INLINE bool uppercasep (int c) { return downcase (c) != c; }
1370
1371/* Upcase a character C known to be not upper case. */
1372INLINE int 1369INLINE int
1373upcase1 (int c) 1370upcase (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. */
1378INLINE 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. */
1381INLINE bool 1384INLINE bool
1382lowercasep (int c) 1385lowercasep (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. */
1388INLINE int upcase (int c) { return uppercasep (c) ? c : upcase1 (c); }
1389
1390INLINE_HEADER_END 1390INLINE_HEADER_END
1391 1391
1392#endif /* EMACS_BUFFER_H */ 1392#endif /* EMACS_BUFFER_H */