Annotation of 43BSDReno/contrib/emacs-18.55/src/casefiddle.c, revision 1.1

1.1     ! root        1: /* GNU Emacs case conversion functions.
        !             2:    Copyright (C) 1985 Free Software Foundation, Inc.
        !             3: 
        !             4: This file is part of GNU Emacs.
        !             5: 
        !             6: GNU Emacs is distributed in the hope that it will be useful,
        !             7: but WITHOUT ANY WARRANTY.  No author or distributor
        !             8: accepts responsibility to anyone for the consequences of using it
        !             9: or for whether it serves any particular purpose or works at all,
        !            10: unless he says so in writing.  Refer to the GNU Emacs General Public
        !            11: License for full details.
        !            12: 
        !            13: Everyone is granted permission to copy, modify and redistribute
        !            14: GNU Emacs, but only under the conditions described in the
        !            15: GNU Emacs General Public License.   A copy of this license is
        !            16: supposed to have been given to you along with GNU Emacs so you
        !            17: can know your rights and responsibilities.  It should be in a
        !            18: file named COPYING.  Among other things, the copyright notice
        !            19: and this notice must be preserved on all copies.  */
        !            20: 
        !            21: 
        !            22: #include "config.h"
        !            23: #include "lisp.h"
        !            24: #include "buffer.h"
        !            25: #include "commands.h"
        !            26: #include "syntax.h"
        !            27: 
        !            28: enum case_action {CASE_UP, CASE_DOWN, CASE_CAPITALIZE, CASE_CAPITALIZE_UP};
        !            29: 
        !            30: Lisp_Object
        !            31: casify_object (flag, obj)
        !            32:      enum case_action flag;
        !            33:      Lisp_Object obj;
        !            34: {
        !            35:   register int i, c, len;
        !            36:   register int inword = flag == CASE_DOWN;
        !            37: 
        !            38:   while (1)
        !            39:     {
        !            40:       if (XTYPE (obj) == Lisp_Int)
        !            41:        {
        !            42:          c = XINT (obj);
        !            43:          if (c >= 0 && c <= 0400)
        !            44:            {
        !            45:              if (inword)
        !            46:                XFASTINT (obj) = DOWNCASE (c);
        !            47:              else if (!UPPERCASEP (c))
        !            48:                XFASTINT (obj) = UPCASE1 (c);
        !            49:            }
        !            50:          return obj;
        !            51:        }
        !            52:       if (XTYPE (obj) == Lisp_String)
        !            53:        {
        !            54:          obj = Fcopy_sequence (obj);
        !            55:          len = XSTRING (obj)->size;
        !            56:          for (i = 0; i < len; i++)
        !            57:            {
        !            58:              c = XSTRING (obj)->data[i];
        !            59:              if (inword)
        !            60:                c = DOWNCASE (c);
        !            61:              else if (!UPPERCASEP (c))
        !            62:                c = UPCASE1 (c);
        !            63:              XSTRING (obj)->data[i] = c;
        !            64:              if (flag == CASE_CAPITALIZE)
        !            65:                inword = SYNTAX (c) == Sword;
        !            66:            }
        !            67:          return obj;
        !            68:        }
        !            69:       obj = wrong_type_argument (Qchar_or_string_p, obj, 0);
        !            70:     }
        !            71: }
        !            72: 
        !            73: DEFUN ("upcase", Fupcase, Supcase, 1, 1, 0,
        !            74:   "One arg, a character or string.  Convert it to upper case and return that.")
        !            75:   (obj)
        !            76:      Lisp_Object obj;
        !            77: {
        !            78:   return casify_object (CASE_UP, obj);
        !            79: }
        !            80: 
        !            81: DEFUN ("downcase", Fdowncase, Sdowncase, 1, 1, 0,
        !            82:   "One arg, a character or string.  Convert it to lower case and return that.")
        !            83:   (obj)
        !            84:      Lisp_Object obj;
        !            85: {
        !            86:   return casify_object (CASE_DOWN, obj);
        !            87: }
        !            88: 
        !            89: DEFUN ("capitalize", Fcapitalize, Scapitalize, 1, 1, 0,
        !            90:   "One arg, a character or string.  Convert it to capitalized form and return that.\n\
        !            91: This means that each word's first character is upper case and the rest is lower case.")
        !            92:   (obj)
        !            93:      Lisp_Object obj;
        !            94: {
        !            95:   return casify_object (CASE_CAPITALIZE, obj);
        !            96: }
        !            97: 
        !            98: /* flag is CASE_UP, CASE_DOWN or CASE_CAPITALIZE or CASE_CAPITALIZE_UP.
        !            99:    b and e specify range of buffer to operate on. */
        !           100: 
        !           101: casify_region (flag, b, e)
        !           102:      enum case_action flag;
        !           103:      Lisp_Object b, e;
        !           104: {
        !           105:   register int i;
        !           106:   register int c;
        !           107:   register int inword = flag == CASE_DOWN;
        !           108: 
        !           109:   validate_region (&b, &e);
        !           110:   prepare_to_modify_buffer ();
        !           111:   record_change (XFASTINT (b), XFASTINT (e) - XFASTINT (b));
        !           112: 
        !           113:   for (i = XFASTINT (b); i < XFASTINT (e); i++)
        !           114:     {
        !           115:       c = CharAt (i);
        !           116:       if (inword && flag != CASE_CAPITALIZE_UP)
        !           117:        c = DOWNCASE (c);
        !           118:       else if (!UPPERCASEP (c)
        !           119:               && (!inword || flag != CASE_CAPITALIZE_UP))
        !           120:        c = UPCASE1 (c);
        !           121:       CharAt (i) = c;
        !           122:       if ((int) flag >= (int) CASE_CAPITALIZE)
        !           123:        inword = SYNTAX (c) == Sword;
        !           124:     }
        !           125: 
        !           126:   modify_region (XFASTINT (b), XFASTINT (e));
        !           127: }
        !           128: 
        !           129: DEFUN ("upcase-region", Fupcase_region, Supcase_region, 2, 2, "r",
        !           130:   "Convert the region to upper case.  In programs, wants two arguments.\n\
        !           131: These arguments specify the starting and ending character numbers of\n\
        !           132: the region to operate on.  When used as a command, the text between\n\
        !           133: point and the mark is operated on.")
        !           134:   (b, e)
        !           135:      Lisp_Object b, e;
        !           136: {
        !           137:   casify_region (CASE_UP, b, e);
        !           138:   return Qnil;
        !           139: }
        !           140: 
        !           141: DEFUN ("downcase-region", Fdowncase_region, Sdowncase_region, 2, 2, "r",
        !           142:   "Convert the region to lower case.  In programs, wants two arguments.\n\
        !           143: These arguments specify the starting and ending character numbers of\n\
        !           144: the region to operate on.  When used as a command, the text between\n\
        !           145: point and the mark is operated on.")
        !           146:   (b, e)
        !           147:      Lisp_Object b, e;
        !           148: {
        !           149:   casify_region (CASE_DOWN, b, e);
        !           150:   return Qnil;
        !           151: }
        !           152: 
        !           153: DEFUN ("capitalize-region", Fcapitalize_region, Scapitalize_region, 2, 2, "r",
        !           154:   "Convert the region to upper case.  In programs, wants two arguments.\n\
        !           155: These arguments specify the starting and ending character numbers of\n\
        !           156: the region to operate on.  When used as a command, the text between\n\
        !           157: point and the mark is operated on.\n\
        !           158: Capitalized form means each word's first character is upper case\n\
        !           159: and the rest of it is lower case.")
        !           160:   (b, e)
        !           161:      Lisp_Object b, e;
        !           162: {
        !           163:   casify_region (CASE_CAPITALIZE, b, e);
        !           164:   return Qnil;
        !           165: }
        !           166: 
        !           167: /* Like Fcapitalize but change only the initials.  */
        !           168: 
        !           169: Lisp_Object
        !           170: upcase_initials_region (b, e)
        !           171:      Lisp_Object b, e;
        !           172: {
        !           173:   casify_region (CASE_CAPITALIZE_UP, b, e);
        !           174:   return Qnil;
        !           175: }
        !           176: 
        !           177: void
        !           178: operate_on_word (flag, arg)
        !           179:      int flag;
        !           180:      Lisp_Object arg;
        !           181: {
        !           182:   Lisp_Object beg, end;
        !           183:   int farend;
        !           184:   CHECK_NUMBER (arg, 0);
        !           185:   farend = scan_words (point, XINT (arg));
        !           186:   if (!farend)
        !           187:     farend = XINT (arg) > 0 ? NumCharacters + 1 : FirstCharacter;
        !           188:   XFASTINT (beg) = point < farend ? point : farend;
        !           189:   XFASTINT (end) = point > farend ? point : farend;
        !           190:   casify_region (flag, beg, end);
        !           191:   SetPoint (XFASTINT (end));
        !           192: }
        !           193: 
        !           194: DEFUN ("upcase-word", Fupcase_word, Supcase_word, 1, 1, "p",
        !           195:   "Convert following word (or ARG words) to upper case, moving over.\n\
        !           196: With negative argument, convert previous words but do not move.")
        !           197:   (arg)
        !           198:      Lisp_Object arg;
        !           199: {
        !           200:   operate_on_word (CASE_UP, arg);
        !           201:   return Qnil;
        !           202: }
        !           203: 
        !           204: DEFUN ("downcase-word", Fdowncase_word, Sdowncase_word, 1, 1, "p",
        !           205:   "Convert following word (or ARG words) to lower case, moving over.\n\
        !           206: With negative argument, convert previous words but do not move.")
        !           207:   (arg)
        !           208:      Lisp_Object arg;
        !           209: {
        !           210:   operate_on_word (CASE_DOWN, arg);
        !           211:   return Qnil;
        !           212: }
        !           213: 
        !           214: DEFUN ("capitalize-word", Fcapitalize_word, Scapitalize_word, 1, 1, "p",
        !           215:   "Capitalize the following word (or ARG words), moving over.\n\
        !           216: This gives the word(s) a first character in upper case\n\
        !           217: and the rest lower case.\n\
        !           218: With negative argument, capitalize previous words but do not move.")
        !           219:   (arg)
        !           220:      Lisp_Object arg;
        !           221: {
        !           222:   operate_on_word (CASE_CAPITALIZE, arg);
        !           223:   return Qnil;
        !           224: }
        !           225: 
        !           226: syms_of_casefiddle ()
        !           227: {
        !           228:   defsubr (&Supcase);
        !           229:   defsubr (&Sdowncase);
        !           230:   defsubr (&Scapitalize);
        !           231:   defsubr (&Supcase_region);
        !           232:   defsubr (&Sdowncase_region);
        !           233:   defsubr (&Scapitalize_region);
        !           234:   defsubr (&Supcase_word);
        !           235:   defsubr (&Sdowncase_word);
        !           236:   defsubr (&Scapitalize_word);
        !           237: }
        !           238: 
        !           239: keys_of_casefiddle ()
        !           240: {
        !           241:   defkey (CtlXmap, Ctl('U'), "upcase-region");
        !           242:   defkey (CtlXmap, Ctl('L'), "downcase-region");
        !           243:   defkey (ESCmap, 'u', "upcase-word");
        !           244:   defkey (ESCmap, 'l', "downcase-word");
        !           245:   defkey (ESCmap, 'c', "capitalize-word");
        !           246: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.