Mercurial > hg > xemacs-beta
diff src/casefiddle.c @ 183:e121b013d1f0 r20-3b18
Import from CVS: tag r20-3b18
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:54:23 +0200 |
parents | 85ec50267440 |
children | 3d6bfa290dbd |
line wrap: on
line diff
--- a/src/casefiddle.c Mon Aug 13 09:53:23 2007 +0200 +++ b/src/casefiddle.c Mon Aug 13 09:54:23 2007 +0200 @@ -18,7 +18,7 @@ the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* Synched up with: FSF 19.30. */ +/* Synched up with: FSF 19.34. */ #include <config.h> #include "lisp.h" @@ -31,36 +31,31 @@ enum case_action {CASE_UP, CASE_DOWN, CASE_CAPITALIZE, CASE_CAPITALIZE_UP}; static Lisp_Object -casify_object (struct buffer *buf, enum case_action flag, Lisp_Object obj) +casify_object (enum case_action flag, Lisp_Object obj, Lisp_Object buffer) { - REGISTER Emchar c; - REGISTER Charcount i, len; - REGISTER int inword = flag == CASE_DOWN; - struct Lisp_Char_Table *syntax_table = - XCHAR_TABLE (buf->mirror_syntax_table); + struct buffer *buf = decode_buffer (buffer, 0); + REGISTER int inword = (flag == CASE_DOWN); + struct Lisp_Char_Table *syntax_table = XCHAR_TABLE (buf->mirror_syntax_table); while (1) { if (CHAR_OR_CHAR_INTP (obj)) { + Emchar c; CHECK_CHAR_COERCE_INT (obj); c = XCHAR (obj); if (IN_TRT_TABLE_DOMAIN (c)) - { - if (inword) - obj = make_char (DOWNCASE (buf, c)); - else if (!UPPERCASEP (buf, c)) - obj = make_char (UPCASE1 (buf, c)); - } + obj = make_char (inword ? DOWNCASE (buf, c) : UPCASE1 (buf, c)); return obj; } if (STRINGP (obj)) { + Charcount i; + Charcount len = string_char_length (XSTRING (obj)); obj = Fcopy_sequence (obj); - len = string_char_length (XSTRING (obj)); for (i = 0; i < len; i++) { - c = string_char (XSTRING (obj), i); + Emchar c = string_char (XSTRING (obj), i); if (inword) c = DOWNCASE (buf, c); else if (!UPPERCASEP (buf, c) @@ -86,7 +81,7 @@ */ (obj, buffer)) { - return casify_object (decode_buffer (buffer, 0), CASE_UP, obj); + return casify_object (CASE_UP, obj, buffer); } DEFUN ("downcase", Fdowncase, 1, 2, 0, /* @@ -98,7 +93,7 @@ */ (obj, buffer)) { - return casify_object (decode_buffer (buffer, 0), CASE_DOWN, obj); + return casify_object (CASE_DOWN, obj, buffer); } DEFUN ("capitalize", Fcapitalize, 1, 2, 0, /* @@ -112,7 +107,7 @@ */ (obj, buffer)) { - return casify_object (decode_buffer (buffer, 0), CASE_CAPITALIZE, obj); + return casify_object (CASE_CAPITALIZE, obj, buffer); } /* Like Fcapitalize but change only the initials. */ @@ -127,23 +122,21 @@ */ (obj, buffer)) { - return casify_object (decode_buffer (buffer, 0), CASE_CAPITALIZE_UP, obj); + return casify_object (CASE_CAPITALIZE_UP, obj, buffer); } /* flag is CASE_UP, CASE_DOWN or CASE_CAPITALIZE or CASE_CAPITALIZE_UP. b and e specify range of buffer to operate on. */ static void -casify_region (struct buffer *buf, enum case_action flag, Lisp_Object b, - Lisp_Object e) +casify_region_internal (enum case_action flag, Lisp_Object b, Lisp_Object e, + struct buffer *buf) { /* This function can GC */ REGISTER Bufpos i; Bufpos start, end; - REGISTER Emchar c; REGISTER int inword = (flag == CASE_DOWN); - struct Lisp_Char_Table *syntax_table = - XCHAR_TABLE (buf->mirror_syntax_table); + struct Lisp_Char_Table *syntax_table = XCHAR_TABLE (buf->mirror_syntax_table); int mccount; if (EQ (b, e)) @@ -154,18 +147,23 @@ mccount = begin_multiple_change (buf, start, end); record_change (buf, start, end - start); - BUF_MODIFF (buf)++; for (i = start; i < end; i++) { - c = BUF_FETCH_CHAR (buf, i); + Emchar c = BUF_FETCH_CHAR (buf, i); + Emchar oldc = c; + if (inword && flag != CASE_CAPITALIZE_UP) c = DOWNCASE (buf, c); else if (!UPPERCASEP (buf, c) && (!inword || flag != CASE_CAPITALIZE_UP)) c = UPCASE1 (buf, c); - buffer_replace_char (buf, i, c, 1, (i == start)); + if (oldc != c) + { + buffer_replace_char (buf, i, c, 1, (i == start)); + BUF_MODIFF (buf)++; + } /* !!#### need to revalidate the start and end pointers in case the buffer was changed */ if ((int) flag >= (int) CASE_CAPITALIZE) @@ -174,6 +172,14 @@ end_multiple_change (buf, mccount); } +INLINE Lisp_Object +casify_region (enum case_action flag, Lisp_Object b, Lisp_Object e, + Lisp_Object buffer) +{ + casify_region_internal (flag, b, e, decode_buffer (buffer, 1)); + return Qnil; +} + DEFUN ("upcase-region", Fupcase_region, 2, 3, "r", /* Convert the region to upper case. In programs, wants two arguments. These arguments specify the starting and ending character numbers of @@ -185,8 +191,7 @@ (b, e, buffer)) { /* This function can GC */ - casify_region (decode_buffer (buffer, 1), CASE_UP, b, e); - return Qnil; + return casify_region (CASE_UP, b, e, buffer); } DEFUN ("downcase-region", Fdowncase_region, 2, 3, "r", /* @@ -199,8 +204,7 @@ (b, e, buffer)) { /* This function can GC */ - casify_region (decode_buffer (buffer, 1), CASE_DOWN, b, e); - return Qnil; + return casify_region (CASE_DOWN, b, e, buffer); } DEFUN ("capitalize-region", Fcapitalize_region, 2, 3, "r", /* @@ -214,8 +218,7 @@ (b, e, buffer)) { /* This function can GC */ - casify_region (decode_buffer (buffer, 1), CASE_CAPITALIZE, b, e); - return Qnil; + return casify_region (CASE_CAPITALIZE, b, e, buffer); } /* Like Fcapitalize_region but change only the initials. */ @@ -229,23 +232,25 @@ */ (b, e, buffer)) { - casify_region (decode_buffer (buffer, 1), CASE_CAPITALIZE_UP, b, e); - return Qnil; + return casify_region (CASE_CAPITALIZE_UP, b, e, buffer); } static Lisp_Object -operate_on_word (struct buffer *buf, Lisp_Object arg, int *newpoint) +casify_word (enum case_action flag, Lisp_Object arg, Lisp_Object buffer) { Bufpos farend; + struct buffer *buf = decode_buffer (buffer, 1); CHECK_INT (arg); + farend = scan_words (buf, BUF_PT (buf), XINT (arg)); if (!farend) farend = XINT (arg) > 0 ? BUF_ZV (buf) : BUF_BEGV (buf); - *newpoint = ((BUF_PT (buf) > farend) ? BUF_PT (buf) : farend); - return (make_int (farend)); + casify_region_internal (flag, make_int (BUF_PT (buf)), make_int (farend), buf); + BUF_SET_PT (buf, max (BUF_PT (buf), farend)); + return Qnil; } DEFUN ("upcase-word", Fupcase_word, 1, 2, "p", /* @@ -257,15 +262,7 @@ (arg, buffer)) { /* This function can GC */ - Lisp_Object beg, end; - Bufpos newpoint; - struct buffer *buf = decode_buffer (buffer, 1); - - beg = make_int (BUF_PT (buf)); - end = operate_on_word (buf, arg, &newpoint); - casify_region (buf, CASE_UP, beg, end); - BUF_SET_PT (buf, newpoint); - return Qnil; + return casify_word (CASE_UP, arg, buffer); } DEFUN ("downcase-word", Fdowncase_word, 1, 2, "p", /* @@ -276,15 +273,7 @@ (arg, buffer)) { /* This function can GC */ - Lisp_Object beg, end; - Bufpos newpoint; - struct buffer *buf = decode_buffer (buffer, 1); - - beg = make_int (BUF_PT (buf)); - end = operate_on_word (buf, arg, &newpoint); - casify_region (buf, CASE_DOWN, beg, end); - BUF_SET_PT (buf, newpoint); - return Qnil; + return casify_word (CASE_DOWN, arg, buffer); } DEFUN ("capitalize-word", Fcapitalize_word, 1, 2, "p", /* @@ -297,15 +286,7 @@ (arg, buffer)) { /* This function can GC */ - Lisp_Object beg, end; - Bufpos newpoint; - struct buffer *buf = decode_buffer (buffer, 1); - - beg = make_int (BUF_PT (buf)); - end = operate_on_word (buf, arg, &newpoint); - casify_region (buf, CASE_CAPITALIZE, beg, end); - BUF_SET_PT (buf, newpoint); - return Qnil; + return casify_word (CASE_CAPITALIZE, arg, buffer); }