Annotation of 43BSD/contrib/emacs/src/casefiddle.c, revision 1.1.1.1

1.1       root        1: /* GNU Emacs case conversion functions.
                      2:    Copyright (C) 1985 Richard M. Stallman.
                      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: #define UPCASE 0
                     29: #define DOWNCASE 1
                     30: #define CAPITALIZE 2
                     31: #define CAPITALIZE_UP 3
                     32: 
                     33: Lisp_Object
                     34: casify_object (flag, obj)
                     35:      int flag;
                     36:      Lisp_Object obj;
                     37: {
                     38:   register int i, c, len;
                     39:   register int inword = flag == DOWNCASE;
                     40: 
                     41:   while (1)
                     42:     {
                     43:       if (XTYPE (obj) == Lisp_Int)
                     44:        {
                     45:          c = XINT (obj);
                     46:          if (inword
                     47:              ? (c >= 'A' && c <= 'Z')
                     48:              : (c >= 'a' && c <= 'z'))
                     49:            XFASTINT (obj) = c ^ ('a' - 'A');
                     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 >= 'A' && c <= 'Z')
                     61:                  : (c >= 'a' && c <= 'z'))
                     62:                XSTRING (obj)->data[i] = c ^ ('a' - 'A');
                     63:              if (flag == CAPITALIZE)
                     64:                inword = SYNTAX (c) == Sword;
                     65:            }
                     66:          return obj;
                     67:        }
                     68:       obj = wrong_type_argument (Qchar_or_string_p, obj, 0);
                     69:     }
                     70: }
                     71: 
                     72: DEFUN ("upcase", Fupcase, Supcase, 1, 1, 0,
                     73:   "One arg, a character or string.  Convert it to upper case and return that.")
                     74:   (obj)
                     75:      Lisp_Object obj;
                     76: {
                     77:   return casify_object (UPCASE, obj);
                     78: }
                     79: 
                     80: DEFUN ("downcase", Fdowncase, Sdowncase, 1, 1, 0,
                     81:   "One arg, a character or string.  Convert it to lower case and return that.")
                     82:   (obj)
                     83:      Lisp_Object obj;
                     84: {
                     85:   return casify_object (DOWNCASE, obj);
                     86: }
                     87: 
                     88: DEFUN ("capitalize", Fcapitalize, Scapitalize, 1, 1, 0,
                     89:   "One arg, a character or string.  Convert it to capitalized form and return that.\n\
                     90: This means that each word's first character is upper case and the rest is lower case.")
                     91:   (obj)
                     92:      Lisp_Object obj;
                     93: {
                     94:   return casify_object (CAPITALIZE, obj);
                     95: }
                     96: 
                     97: /* flag is UPCASE, DOWNCASE or CAPITALIZE or CAPITALIZE_UP.
                     98:    b and e specify range of buffer to operate on. */
                     99: 
                    100: casify_region (flag, b, e)
                    101:      Lisp_Object b, e;
                    102: {
                    103:   register int i;
                    104:   register int c;
                    105:   register int inword = flag == DOWNCASE;
                    106: 
                    107:   validate_region (&b, &e);
                    108:   if (!NULL (bf_cur->read_only))
                    109:     Fbarf_if_buffer_read_only();
                    110:   RecordChange (XFASTINT (b), XFASTINT (e) - XFASTINT (b));
                    111:   modify_region (XFASTINT (b), XFASTINT (e));
                    112: 
                    113:   for (i = XFASTINT (b); i < XFASTINT (e); i++)
                    114:     {
                    115:       c = CharAt (i);
                    116:       if (inword
                    117:          ? (c >= 'A' && c <= 'Z' && flag != CAPITALIZE_UP)
                    118:          : (c >= 'a' && c <= 'z'))
                    119:        CharAt (i) = c ^ ('a' - 'A');
                    120:       if (flag >= CAPITALIZE)
                    121:        inword = SYNTAX (c) == Sword;
                    122:     }
                    123: }
                    124: 
                    125: DEFUN ("upcase-region", Fupcase_region, Supcase_region, 2, 2, "r",
                    126:   "Convert the region to upper case.  In programs, wants two arguments.\n\
                    127: These arguments specify the starting and ending character numbers of\n\
                    128: the region to operate on.  When used as a command, the text between\n\
                    129: point and the mark is operated on.")
                    130:   (b, e)
                    131:      Lisp_Object b, e;
                    132: {
                    133:   casify_region (UPCASE, b, e);
                    134:   return Qnil;
                    135: }
                    136: 
                    137: DEFUN ("downcase-region", Fdowncase_region, Sdowncase_region, 2, 2, "r",
                    138:   "Convert the region to lower case.  In programs, wants two arguments.\n\
                    139: These arguments specify the starting and ending character numbers of\n\
                    140: the region to operate on.  When used as a command, the text between\n\
                    141: point and the mark is operated on.")
                    142:   (b, e)
                    143:      Lisp_Object b, e;
                    144: {
                    145:   casify_region (DOWNCASE, b, e);
                    146:   return Qnil;
                    147: }
                    148: 
                    149: DEFUN ("capitalize-region", Fcapitalize_region, Scapitalize_region, 2, 2, "r",
                    150:   "Convert the region to upper case.  In programs, wants two arguments.\n\
                    151: These arguments specify the starting and ending character numbers of\n\
                    152: the region to operate on.  When used as a command, the text between\n\
                    153: point and the mark is operated on.\n\
                    154: Capitalized form means each word's first character is upper case\n\
                    155: and the rest of it is lower case.")
                    156:   (b, e)
                    157:      Lisp_Object b, e;
                    158: {
                    159:   casify_region (CAPITALIZE, b, e);
                    160:   return Qnil;
                    161: }
                    162: 
                    163: /* Like Fcapitalize but change only the initials.  */
                    164: 
                    165: Lisp_Object
                    166: upcase_initials_region (b, e)
                    167:      Lisp_Object b, e;
                    168: {
                    169:   casify_region (CAPITALIZE_UP, b, e);
                    170:   return Qnil;
                    171: }
                    172: 
                    173: void
                    174: operate_on_word (flag, arg)
                    175:      int flag;
                    176:      Lisp_Object arg;
                    177: {
                    178:   Lisp_Object beg, end;
                    179:   int farend;
                    180:   CHECK_NUMBER (arg, 0);
                    181:   farend = scan_words (point, XINT (arg));
                    182:   if (!farend)
                    183:     farend = XINT (arg) > 0 ? NumCharacters + 1 : FirstCharacter;
                    184:   XFASTINT (beg) = point < farend ? point : farend;
                    185:   XFASTINT (end) = point > farend ? point : farend;
                    186:   casify_region (flag, beg, end);
                    187:   SetPoint (XFASTINT (end));
                    188: }
                    189: 
                    190: DEFUN ("upcase-word", Fupcase_word, Supcase_word, 1, 1, "p",
                    191:   "Convert following word (or ARG words) to upper case, moving over.\n\
                    192: With negative argument, convert previous words but do not move.")
                    193:   (arg)
                    194:      Lisp_Object arg;
                    195: {
                    196:   operate_on_word (UPCASE, arg);
                    197:   return Qnil;
                    198: }
                    199: 
                    200: DEFUN ("downcase-word", Fdowncase_word, Sdowncase_word, 1, 1, "p",
                    201:   "Convert following word (or ARG words) to lower case, moving over.\n\
                    202: With negative argument, convert previous words but do not move.")
                    203:   (arg)
                    204:      Lisp_Object arg;
                    205: {
                    206:   operate_on_word (DOWNCASE, arg);
                    207:   return Qnil;
                    208: }
                    209: 
                    210: DEFUN ("capitalize-word", Fcapitalize_word, Scapitalize_word, 1, 1, "p",
                    211:   "Capitalize the following word (or ARG words), moving over.\n\
                    212: This gives the word(s) a first character in upper case\n\
                    213: and the rest lower case.\n\
                    214: With negative argument, capitalize previous words but do not move.")
                    215:   (arg)
                    216:      Lisp_Object arg;
                    217: {
                    218:   operate_on_word (CAPITALIZE, arg);
                    219:   return Qnil;
                    220: }
                    221: 
                    222: syms_of_casefiddle ()
                    223: {
                    224:   defsubr (&Supcase);
                    225:   defsubr (&Sdowncase);
                    226:   defsubr (&Scapitalize);
                    227:   defsubr (&Supcase_region);
                    228:   defsubr (&Sdowncase_region);
                    229:   defsubr (&Scapitalize_region);
                    230:   defsubr (&Supcase_word);
                    231:   defsubr (&Sdowncase_word);
                    232:   defsubr (&Scapitalize_word);
                    233: }
                    234: 
                    235: keys_of_casefiddle ()
                    236: {
                    237:   defkey (CtlXmap, Ctl('U'), "upcase-region");
                    238:   defkey (CtlXmap, Ctl('L'), "downcase-region");
                    239:   defkey (ESCmap, 'u', "upcase-word");
                    240:   defkey (ESCmap, 'l', "downcase-word");
                    241:   defkey (ESCmap, 'c', "capitalize-word");
                    242: }

unix.superglobalmegacorp.com

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