X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/e3a10b5e595a84821b3440c484c840b541ba669f..ffdf4f267a4e630e055c1470cae04525dee0784c:/src/casefiddle.c diff --git a/src/casefiddle.c b/src/casefiddle.c index 65fc4f0d80..8b92d39cbb 100644 --- a/src/casefiddle.c +++ b/src/casefiddle.c @@ -25,6 +25,8 @@ Boston, MA 02111-1307, USA. */ #include "charset.h" #include "commands.h" #include "syntax.h" +#include "composite.h" +#include "keymap.h" enum case_action {CASE_UP, CASE_DOWN, CASE_CAPITALIZE, CASE_CAPITALIZE_UP}; @@ -37,7 +39,6 @@ casify_object (flag, obj) { register int i, c, len; register int inword = flag == CASE_DOWN; - Lisp_Object tem; /* If the case table is flagged as modified, rescan it. */ if (NILP (XCHAR_TABLE (current_buffer->downcase_table)->extras[1])) @@ -67,12 +68,12 @@ casify_object (flag, obj) int multibyte = STRING_MULTIBYTE (obj); obj = Fcopy_sequence (obj); - len = STRING_BYTES (XSTRING (obj)); + len = SBYTES (obj); /* Scan all single-byte characters from start of string. */ for (i = 0; i < len;) { - c = XSTRING (obj)->data[i]; + c = SREF (obj, i); if (multibyte && c >= 0x80) /* A multibyte character can't be handled in this @@ -89,7 +90,7 @@ casify_object (flag, obj) : ! SINGLE_BYTE_CHAR_P (c)) break; - XSTRING (obj)->data[i] = c; + SSET (obj, i, c); if ((int) flag >= (int) CASE_CAPITALIZE) inword = SYNTAX (c) == Sword; i++; @@ -101,35 +102,30 @@ casify_object (flag, obj) { /* The work is not yet finished because of a multibyte character just encountered. */ - int fromlen, tolen, j = i, j_byte = i; + int fromlen, j_byte = i; char *buf - = (char *) alloca ((len - i) * MAX_LENGTH_OF_MULTI_BYTE_FORM - + i); - unsigned char *str, workbuf[4]; + = (char *) alloca ((len - i) * MAX_MULTIBYTE_LENGTH + i); /* Copy data already handled. */ - bcopy (XSTRING (obj)->data, buf, i); + bcopy (SDATA (obj), buf, i); /* From now on, I counts bytes. */ while (i < len) { - c = STRING_CHAR_AND_LENGTH (XSTRING (obj)->data + i, + c = STRING_CHAR_AND_LENGTH (SDATA (obj) + i, len - i, fromlen); if (inword && flag != CASE_CAPITALIZE_UP) c = DOWNCASE (c); else if (!UPPERCASEP (c) && (!inword || flag != CASE_CAPITALIZE_UP)) c = UPCASE1 (c); - tolen = CHAR_STRING (c, workbuf, str); - bcopy (str, buf + j_byte, tolen); i += fromlen; - j++; - j_byte += tolen; + j_byte += CHAR_STRING (c, buf + j_byte); if ((int) flag >= (int) CASE_CAPITALIZE) inword = SYNTAX (c) == Sword; } - obj = make_specified_string (buf, j, j_byte, - STRING_MULTIBYTE (obj)); + obj = make_multibyte_string (buf, SCHARS (obj), + j_byte); } return obj; } @@ -138,33 +134,33 @@ casify_object (flag, obj) } DEFUN ("upcase", Fupcase, Supcase, 1, 1, 0, - "Convert argument to upper case and return that.\n\ -The argument may be a character or string. The result has the same type.\n\ -The argument object is not altered--the value is a copy.\n\ -See also `capitalize', `downcase' and `upcase-initials'.") - (obj) + doc: /* Convert argument to upper case and return that. +The argument may be a character or string. The result has the same type. +The argument object is not altered--the value is a copy. +See also `capitalize', `downcase' and `upcase-initials'. */) + (obj) Lisp_Object obj; { return casify_object (CASE_UP, obj); } DEFUN ("downcase", Fdowncase, Sdowncase, 1, 1, 0, - "Convert argument to lower case and return that.\n\ -The argument may be a character or string. The result has the same type.\n\ -The argument object is not altered--the value is a copy.") - (obj) + doc: /* Convert argument to lower case and return that. +The argument may be a character or string. The result has the same type. +The argument object is not altered--the value is a copy. */) + (obj) Lisp_Object obj; { return casify_object (CASE_DOWN, obj); } DEFUN ("capitalize", Fcapitalize, Scapitalize, 1, 1, 0, - "Convert argument to capitalized form and return that.\n\ -This means that each word's first character is upper case\n\ -and the rest is lower case.\n\ -The argument may be a character or string. The result has the same type.\n\ -The argument object is not altered--the value is a copy.") - (obj) + doc: /* Convert argument to capitalized form and return that. +This means that each word's first character is upper case +and the rest is lower case. +The argument may be a character or string. The result has the same type. +The argument object is not altered--the value is a copy. */) + (obj) Lisp_Object obj; { return casify_object (CASE_CAPITALIZE, obj); @@ -173,11 +169,11 @@ The argument object is not altered--the value is a copy.") /* Like Fcapitalize but change only the initials. */ DEFUN ("upcase-initials", Fupcase_initials, Supcase_initials, 1, 1, 0, - "Convert the initial of each word in the argument to upper case.\n\ -Do not change the other letters of each word.\n\ -The argument may be a character or string. The result has the same type.\n\ -The argument object is not altered--the value is a copy.") - (obj) + doc: /* Convert the initial of each word in the argument to upper case. +Do not change the other letters of each word. +The argument may be a character or string. The result has the same type. +The argument object is not altered--the value is a copy. */) + (obj) Lisp_Object obj; { return casify_object (CASE_CAPITALIZE_UP, obj); @@ -197,7 +193,7 @@ casify_region (flag, b, e) register int multibyte = !NILP (current_buffer->enable_multibyte_characters); int start, end; int start_byte, end_byte; - Lisp_Object ch, downch, val; + int changed = 0; if (EQ (b, e)) /* Not modifying because nothing marked */ @@ -215,9 +211,10 @@ casify_region (flag, b, e) start_byte = CHAR_TO_BYTE (start); end_byte = CHAR_TO_BYTE (end); - for (i = start_byte; i < end_byte; i++) + for (i = start_byte; i < end_byte; i++, start++) { - c = FETCH_BYTE (i); + int c2; + c = c2 = FETCH_BYTE (i); if (multibyte && c >= 0x80) /* A multibyte character can't be handled in this simple loop. */ break; @@ -227,8 +224,10 @@ casify_region (flag, b, e) && (!inword || flag != CASE_CAPITALIZE_UP)) c = UPCASE1 (c); FETCH_BYTE (i) = c; + if (c != c2) + changed = 1; if ((int) flag >= (int) CASE_CAPITALIZE) - inword = SYNTAX (c) == Sword; + inword = SYNTAX (c) == Sword && (inword || !SYNTAX_PREFIX (c)); } if (i < end_byte) { @@ -251,13 +250,14 @@ casify_region (flag, b, e) if (c != c2) { int fromlen, tolen, j; - unsigned char workbuf[4], *str; + unsigned char str[MAX_MULTIBYTE_LENGTH]; + changed = 1; /* Handle the most likely case */ if (c < 0400 && c2 < 0400) FETCH_BYTE (i) = c2; - else if (fromlen = CHAR_STRING (c, workbuf, str), - tolen = CHAR_STRING (c2, workbuf, str), + else if (fromlen = CHAR_STRING (c, str), + tolen = CHAR_STRING (c2, str), fromlen == tolen) { for (j = 0; j < tolen; ++j) @@ -268,7 +268,7 @@ casify_region (flag, b, e) error ("Can't casify letters that change length"); #if 0 /* This is approximately what we'd like to be able to do here */ if (tolen < fromlen) - del_range_1 (i + tolen, i + fromlen, 0); + del_range_1 (i + tolen, i + fromlen, 0, 0); else if (tolen > fromlen) { TEMP_SET_PT (i + fromlen); @@ -279,21 +279,26 @@ casify_region (flag, b, e) } if ((int) flag >= (int) CASE_CAPITALIZE) inword = SYNTAX (c2) == Sword; - INC_POS (i); + INC_BOTH (start, i); } TEMP_SET_PT_BOTH (opoint, opoint_byte); } - signal_after_change (start, end - start, end - start); + start = XFASTINT (b); + if (changed) + { + signal_after_change (start, end - start, end - start); + update_compositions (start, end, CHECK_ALL); + } } DEFUN ("upcase-region", Fupcase_region, Supcase_region, 2, 2, "r", - "Convert the region to upper case. In programs, wants two arguments.\n\ -These arguments specify the starting and ending character numbers of\n\ -the region to operate on. When used as a command, the text between\n\ -point and the mark is operated on.\n\ -See also `capitalize-region'.") - (beg, end) + doc: /* Convert the region to upper 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. +See also `capitalize-region'. */) + (beg, end) Lisp_Object beg, end; { casify_region (CASE_UP, beg, end); @@ -301,11 +306,11 @@ See also `capitalize-region'.") } DEFUN ("downcase-region", Fdowncase_region, Sdowncase_region, 2, 2, "r", - "Convert the region to lower case. In programs, wants two arguments.\n\ -These arguments specify the starting and ending character numbers of\n\ -the region to operate on. When used as a command, the text between\n\ -point and the mark is operated on.") - (beg, end) + 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. */) + (beg, end) Lisp_Object beg, end; { casify_region (CASE_DOWN, beg, end); @@ -313,12 +318,12 @@ point and the mark is operated on.") } DEFUN ("capitalize-region", Fcapitalize_region, Scapitalize_region, 2, 2, "r", - "Convert the region to capitalized form.\n\ -Capitalized form means each word's first character is upper case\n\ -and the rest of it is lower case.\n\ -In programs, give two arguments, the starting and ending\n\ -character positions to operate on.") - (beg, end) + doc: /* Convert the region to capitalized form. +Capitalized form means each word's first character is upper case +and the rest of it is lower case. +In programs, give two arguments, the starting and ending +character positions to operate on. */) + (beg, end) Lisp_Object beg, end; { casify_region (CASE_CAPITALIZE, beg, end); @@ -329,11 +334,11 @@ character positions to operate on.") DEFUN ("upcase-initials-region", Fupcase_initials_region, Supcase_initials_region, 2, 2, "r", - "Upcase the initial of each word in the region.\n\ -Subsequent letters of each word are not changed.\n\ -In programs, give two arguments, the starting and ending\n\ -character positions to operate on.") - (beg, end) + doc: /* Upcase the initial of each word in the region. +Subsequent letters of each word are not changed. +In programs, give two arguments, the starting and ending +character positions to operate on. */) + (beg, end) Lisp_Object beg, end; { casify_region (CASE_CAPITALIZE_UP, beg, end); @@ -349,7 +354,7 @@ operate_on_word (arg, newpoint) int farend; int iarg; - CHECK_NUMBER (arg, 0); + CHECK_NUMBER (arg); iarg = XINT (arg); farend = scan_words (PT, iarg); if (!farend) @@ -362,10 +367,10 @@ operate_on_word (arg, newpoint) } DEFUN ("upcase-word", Fupcase_word, Supcase_word, 1, 1, "p", - "Convert following word (or ARG words) to upper case, moving over.\n\ -With negative argument, convert previous words but do not move.\n\ -See also `capitalize-word'.") - (arg) + doc: /* Convert following word (or ARG words) to upper case, moving over. +With negative argument, convert previous words but do not move. +See also `capitalize-word'. */) + (arg) Lisp_Object arg; { Lisp_Object beg, end; @@ -378,9 +383,9 @@ See also `capitalize-word'.") } DEFUN ("downcase-word", Fdowncase_word, Sdowncase_word, 1, 1, "p", - "Convert following word (or ARG words) to lower case, moving over.\n\ -With negative argument, convert previous words but do not move.") - (arg) + doc: /* Convert following word (or ARG words) to lower case, moving over. +With negative argument, convert previous words but do not move. */) + (arg) Lisp_Object arg; { Lisp_Object beg, end; @@ -393,11 +398,11 @@ With negative argument, convert previous words but do not move.") } DEFUN ("capitalize-word", Fcapitalize_word, Scapitalize_word, 1, 1, "p", - "Capitalize the following word (or ARG words), moving over.\n\ -This gives the word(s) a first character in upper case\n\ -and the rest lower case.\n\ -With negative argument, capitalize previous words but do not move.") - (arg) + doc: /* Capitalize the following word (or ARG words), moving over. +This gives the word(s) a first character in upper case +and the rest lower case. +With negative argument, capitalize previous words but do not move. */) + (arg) Lisp_Object arg; { Lisp_Object beg, end;