Annotation of GNUtools/emacs/src/casefiddle.c, revision 1.1.1.1

1.1       root        1: /* GNU Emacs case conversion functions.
                      2:    Copyright (C) 1985, 1990 Free Software Foundation, Inc.
                      3: 
                      4: This file is part of GNU Emacs.
                      5: 
                      6: GNU Emacs is free software; you can redistribute it and/or modify
                      7: it under the terms of the GNU General Public License as published by
                      8: the Free Software Foundation; either version 1, or (at your option)
                      9: any later version.
                     10: 
                     11: GNU Emacs is distributed in the hope that it will be useful,
                     12: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     14: GNU General Public License for more details.
                     15: 
                     16: You should have received a copy of the GNU General Public License
                     17: along with GNU Emacs; see the file COPYING.  If not, write to
                     18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
                     19: 
                     20: 
                     21: #include "config.h"
                     22: #include "lisp.h"
                     23: #include "buffer.h"
                     24: #include "commands.h"
                     25: #include "syntax.h"
                     26: 
                     27: enum case_action {CASE_UP, CASE_DOWN, CASE_CAPITALIZE, CASE_CAPITALIZE_UP};
                     28: 
                     29: Lisp_Object
                     30: casify_object (flag, obj)
                     31:      enum case_action flag;
                     32:      Lisp_Object obj;
                     33: {
                     34:   register int i, c, len;
                     35:   register int inword = flag == CASE_DOWN;
                     36: 
                     37:   while (1)
                     38:     {
                     39:       if (XTYPE (obj) == Lisp_Int)
                     40:        {
                     41:          c = XINT (obj);
                     42:          if (c >= 0 && c <= 0400)
                     43:            {
                     44:              if (inword)
                     45:                XFASTINT (obj) = DOWNCASE (c);
                     46:              else if (!UPPERCASEP (c))
                     47:                XFASTINT (obj) = UPCASE1 (c);
                     48:            }
                     49:          return obj;
                     50:        }
                     51:       if (XTYPE (obj) == Lisp_String)
                     52:        {
                     53:          obj = Fcopy_sequence (obj);
                     54:          len = XSTRING (obj)->size;
                     55:          for (i = 0; i < len; i++)
                     56:            {
                     57:              c = XSTRING (obj)->data[i];
                     58:              if (inword)
                     59:                c = DOWNCASE (c);
                     60:              else if (!UPPERCASEP (c))
                     61:                c = UPCASE1 (c);
                     62:              XSTRING (obj)->data[i] = c;
                     63:              if (flag == CASE_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 (CASE_UP, 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 (CASE_DOWN, 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 (CASE_CAPITALIZE, obj);
                     95: }
                     96: 
                     97: /* flag is CASE_UP, CASE_DOWN or CASE_CAPITALIZE or CASE_CAPITALIZE_UP.
                     98:    b and e specify range of buffer to operate on. */
                     99: 
                    100: casify_region (flag, b, e)
                    101:      enum case_action flag;
                    102:      Lisp_Object b, e;
                    103: {
                    104:   register int i;
                    105:   register int c;
                    106:   register int inword = flag == CASE_DOWN;
                    107: 
                    108:   validate_region (&b, &e);
                    109:   prepare_to_modify_buffer ();
                    110:   record_change (XFASTINT (b), XFASTINT (e) - XFASTINT (b));
                    111: 
                    112:   for (i = XFASTINT (b); i < XFASTINT (e); i++)
                    113:     {
                    114:       c = FETCH_CHAR (i);
                    115:       if (inword && flag != CASE_CAPITALIZE_UP)
                    116:        c = DOWNCASE (c);
                    117:       else if (!UPPERCASEP (c)
                    118:               && (!inword || flag != CASE_CAPITALIZE_UP))
                    119:        c = UPCASE1 (c);
                    120:       FETCH_CHAR (i) = c;
                    121:       if ((int) flag >= (int) CASE_CAPITALIZE)
                    122:        inword = SYNTAX (c) == Sword;
                    123:     }
                    124: 
                    125:   modify_region (XFASTINT (b), XFASTINT (e));
                    126: }
                    127: 
                    128: DEFUN ("upcase-region", Fupcase_region, Supcase_region, 2, 2, "r",
                    129:   "Convert the region to upper case.  In programs, wants two arguments.\n\
                    130: These arguments specify the starting and ending character numbers of\n\
                    131: the region to operate on.  When used as a command, the text between\n\
                    132: point and the mark is operated on.")
                    133:   (b, e)
                    134:      Lisp_Object b, e;
                    135: {
                    136:   casify_region (CASE_UP, b, e);
                    137:   return Qnil;
                    138: }
                    139: 
                    140: DEFUN ("downcase-region", Fdowncase_region, Sdowncase_region, 2, 2, "r",
                    141:   "Convert the region to lower case.  In programs, wants two arguments.\n\
                    142: These arguments specify the starting and ending character numbers of\n\
                    143: the region to operate on.  When used as a command, the text between\n\
                    144: point and the mark is operated on.")
                    145:   (b, e)
                    146:      Lisp_Object b, e;
                    147: {
                    148:   casify_region (CASE_DOWN, b, e);
                    149:   return Qnil;
                    150: }
                    151: 
                    152: DEFUN ("capitalize-region", Fcapitalize_region, Scapitalize_region, 2, 2, "r",
                    153:   "Convert the region to upper case.  In programs, wants two arguments.\n\
                    154: These arguments specify the starting and ending character numbers of\n\
                    155: the region to operate on.  When used as a command, the text between\n\
                    156: point and the mark is operated on.\n\
                    157: Capitalized form means each word's first character is upper case\n\
                    158: and the rest of it is lower case.")
                    159:   (b, e)
                    160:      Lisp_Object b, e;
                    161: {
                    162:   casify_region (CASE_CAPITALIZE, b, e);
                    163:   return Qnil;
                    164: }
                    165: 
                    166: /* Like Fcapitalize but change only the initials.  */
                    167: 
                    168: Lisp_Object
                    169: upcase_initials_region (b, e)
                    170:      Lisp_Object b, e;
                    171: {
                    172:   casify_region (CASE_CAPITALIZE_UP, b, e);
                    173:   return Qnil;
                    174: }
                    175: 
                    176: Lisp_Object
                    177: operate_on_word (arg)
                    178:      Lisp_Object arg;
                    179: {
                    180:   Lisp_Object end, val;
                    181:   int farend;
                    182: 
                    183:   CHECK_NUMBER (arg, 0);
                    184:   farend = scan_words (point, XINT (arg));
                    185:   if (!farend)
                    186:     farend = XINT (arg) > 0 ? ZV : BEGV;
                    187:   end = point > farend ? point : farend;
                    188:   SET_PT (end);
                    189:   XFASTINT (val) = farend;
                    190:   return val;
                    191: }
                    192: 
                    193: DEFUN ("upcase-word", Fupcase_word, Supcase_word, 1, 1, "p",
                    194:   "Convert following word (or ARG words) to upper case, moving over.\n\
                    195: With negative argument, convert previous words but do not move.")
                    196:   (arg)
                    197:      Lisp_Object arg;
                    198: {
                    199:   Lisp_Object opoint;
                    200:   XFASTINT (opoint) = point;
                    201:   casify_region (CASE_UP, opoint, operate_on_word (arg));
                    202:   return Qnil;
                    203: }
                    204: 
                    205: DEFUN ("downcase-word", Fdowncase_word, Sdowncase_word, 1, 1, "p",
                    206:   "Convert following word (or ARG words) to lower case, moving over.\n\
                    207: With negative argument, convert previous words but do not move.")
                    208:   (arg)
                    209:      Lisp_Object arg;
                    210: {
                    211:   Lisp_Object opoint;
                    212:   XFASTINT (opoint) = point;
                    213:   casify_region (CASE_DOWN, opoint, operate_on_word (arg));
                    214:   return Qnil;
                    215: }
                    216: 
                    217: DEFUN ("capitalize-word", Fcapitalize_word, Scapitalize_word, 1, 1, "p",
                    218:   "Capitalize the following word (or ARG words), moving over.\n\
                    219: This gives the word(s) a first character in upper case\n\
                    220: and the rest lower case.\n\
                    221: With negative argument, capitalize previous words but do not move.")
                    222:   (arg)
                    223:      Lisp_Object arg;
                    224: {
                    225:   Lisp_Object opoint;
                    226:   XFASTINT (opoint) = point;
                    227:   casify_region (CASE_CAPITALIZE, opoint, operate_on_word (arg));
                    228:   return Qnil;
                    229: }
                    230: 
                    231: syms_of_casefiddle ()
                    232: {
                    233:   defsubr (&Supcase);
                    234:   defsubr (&Sdowncase);
                    235:   defsubr (&Scapitalize);
                    236:   defsubr (&Supcase_region);
                    237:   defsubr (&Sdowncase_region);
                    238:   defsubr (&Scapitalize_region);
                    239:   defsubr (&Supcase_word);
                    240:   defsubr (&Sdowncase_word);
                    241:   defsubr (&Scapitalize_word);
                    242: }
                    243: 
                    244: keys_of_casefiddle ()
                    245: {
                    246:   ndefkey (Vctl_x_map, Ctl('U'), "upcase-region");
                    247:   ndefkey (Vctl_x_map, Ctl('L'), "downcase-region");
                    248:   ndefkey (Vesc_map, 'u', "upcase-word");
                    249:   ndefkey (Vesc_map, 'l', "downcase-word");
                    250:   ndefkey (Vesc_map, 'c', "capitalize-word");
                    251: }

unix.superglobalmegacorp.com

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