X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/f99f7826a0303f7a40864571be7cbf84f3d4ee62..edae7d93ed509aa8a7db3952c70550cf3353d169:/src/casefiddle.c diff --git a/src/casefiddle.c b/src/casefiddle.c index 7f5b99752f..c5bfa36663 100644 --- a/src/casefiddle.c +++ b/src/casefiddle.c @@ -1,14 +1,14 @@ /* GNU Emacs case conversion functions. -Copyright (C) 1985, 1994, 1997-1999, 2001-2013 Free Software Foundation, +Copyright (C) 1985, 1994, 1997-1999, 2001-2016 Free Software Foundation, Inc. This file is part of GNU Emacs. GNU Emacs is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. +the Free Software Foundation, either version 3 of the License, or (at +your option) any later version. GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -30,8 +30,6 @@ along with GNU Emacs. If not, see . */ #include "keymap.h" enum case_action {CASE_UP, CASE_DOWN, CASE_CAPITALIZE, CASE_CAPITALIZE_UP}; - -Lisp_Object Qidentity; static Lisp_Object casify_object (enum case_action flag, Lisp_Object obj) @@ -102,7 +100,7 @@ casify_object (enum case_action flag, Lisp_Object obj) inword = (SYNTAX (c) == Sword); if (c != c1) { - MAKE_CHAR_UNIBYTE (c); + MAKE_CHAR_UNIBYTE (c); /* If the char can't be converted to a valid byte, just don't change it. */ if (c >= 0 && c < 256) @@ -116,15 +114,15 @@ casify_object (enum case_action flag, Lisp_Object obj) ptrdiff_t i, i_byte, size = SCHARS (obj); int len; USE_SAFE_ALLOCA; - ptrdiff_t o_size = (size < STRING_BYTES_BOUND / MAX_MULTIBYTE_LENGTH - ? size * MAX_MULTIBYTE_LENGTH - : STRING_BYTES_BOUND); + ptrdiff_t o_size; + if (INT_MULTIPLY_WRAPV (size, MAX_MULTIBYTE_LENGTH, &o_size)) + o_size = PTRDIFF_MAX; unsigned char *dst = SAFE_ALLOCA (o_size); unsigned char *o = dst; for (i = i_byte = 0; i < size; i++, i_byte += len) { - if (o_size - (o - dst) < MAX_MULTIBYTE_LENGTH) + if (o_size - MAX_MULTIBYTE_LENGTH < o - dst) string_overflow (); c = STRING_CHAR_AND_LENGTH (SDATA (obj) + i_byte, len); if (inword && flag != CASE_CAPITALIZE_UP) @@ -214,7 +212,7 @@ casify_region (enum case_action flag, Lisp_Object b, Lisp_Object e) validate_region (&b, &e); start = XFASTINT (b); end = XFASTINT (e); - modify_region_1 (start, end, false); + modify_text (start, end); record_change (start, end - start); start_byte = CHAR_TO_BYTE (start); @@ -308,14 +306,30 @@ See also `capitalize-region'. */) return Qnil; } -DEFUN ("downcase-region", Fdowncase_region, Sdowncase_region, 2, 2, "r", +DEFUN ("downcase-region", Fdowncase_region, Sdowncase_region, 2, 3, + "(list (region-beginning) (region-end) (region-noncontiguous-p))", doc: /* Convert the region to lower case. In programs, wants two arguments. These arguments specify the starting and ending character numbers of the region to operate on. When used as a command, the text between point and the mark is operated on. */) - (Lisp_Object beg, Lisp_Object end) + (Lisp_Object beg, Lisp_Object end, Lisp_Object region_noncontiguous_p) { - casify_region (CASE_DOWN, beg, end); + Lisp_Object bounds = Qnil; + + if (!NILP (region_noncontiguous_p)) + { + bounds = call1 (Fsymbol_value (intern ("region-extract-function")), + intern ("bounds")); + + while (CONSP (bounds)) + { + casify_region (CASE_DOWN, XCAR (XCAR (bounds)), XCDR (XCAR (bounds))); + bounds = XCDR (bounds); + } + } + else + casify_region (CASE_DOWN, beg, end); + return Qnil; } @@ -365,7 +379,11 @@ operate_on_word (Lisp_Object arg, ptrdiff_t *newpoint) } DEFUN ("upcase-word", Fupcase_word, Supcase_word, 1, 1, "p", - doc: /* Convert following word (or ARG words) to upper case, moving over. + doc: /* Convert to upper case from point to end of word, moving over. + +If point is in the middle of a word, the part of that word before point +is ignored when moving forward. + With negative argument, convert previous words but do not move. See also `capitalize-word'. */) (Lisp_Object arg) @@ -380,7 +398,11 @@ See also `capitalize-word'. */) } DEFUN ("downcase-word", Fdowncase_word, Sdowncase_word, 1, 1, "p", - doc: /* Convert following word (or ARG words) to lower case, moving over. + doc: /* Convert to lower case from point to end of word, moving over. + +If point is in the middle of a word, the part of that word before point +is ignored when moving forward. + With negative argument, convert previous words but do not move. */) (Lisp_Object arg) { @@ -394,9 +416,14 @@ With negative argument, convert previous words but do not move. */) } DEFUN ("capitalize-word", Fcapitalize_word, Scapitalize_word, 1, 1, "p", - doc: /* Capitalize the following word (or ARG words), moving over. + doc: /* Capitalize from point to the end of word, moving over. +With numerical argument ARG, capitalize the next ARG-1 words as well. This gives the word(s) a first character in upper case and the rest lower case. + +If point is in the middle of a word, the part of that word before point +is ignored when moving forward. + With negative argument, capitalize previous words but do not move. */) (Lisp_Object arg) {