/************************************************************************ * This program is Copyright (C) 1986 by Jonathan Payne. JOVE is * * provided to you without charge, and with no warranty. You may give * * away copies of JOVE, including sources, provided that this notice is * * included in all the files. * ************************************************************************/ #include "jove.h" RCS("$Id: case.c,v 14.30.0.10 1994/04/22 18:13:49 tom Exp tom $") #include "ctype.h" private int upper __(( char *_(cp) )); private int upper(cp) register char *cp; { register int c = *cp; *cp = toupper(c); return islower(c); } private int lower __(( char *_(cp) )); private int lower(cp) register char *cp; { register int c = *cp; *cp = tolower(c); return isupper(c); } private char *start; private int capitalize __(( char *_(cp) )); private int capitalize(cp) register char *cp; { register int (*change)__(( char * )) = lower; if (isword(*cp) && (cp == start || !isword(cp[-1]))) change = upper; return (*change)(cp); } private void case_reg __(( void (*_(move))(void), int (*_(change))(char *_(at)) )); private void case_reg(move, change) void (*move)__(( void )); register int (*change)__(( char *_(at) )); { register char *cp; register Buffer *cb = curbuf; Bufpos before, after; DOTsave(&before); (*move)(); DOTsave(&after); exp = 1; fixorder(&before.p_line, &before.p_char, &after.p_line, &after.p_char); SetDot(&before); for (cp = &linebuf[before.p_char]; start = cp, cb->b_dot != after.p_line; cp = linebuf) { while (*cp) { if ((*change)(cp++)) { modify(); makedirty(cb->b_dot); } } NextLine(); } { /* handle the last line */ register char *end = &linebuf[cb->b_char = after.p_char]; while (cp < end) { if ((*change)(cp++)) { modify(); makedirty(cb->b_dot); } } } } DEF_CMD( "case-character-capitalize", CapChar, EDIT ) { case_reg(ForChar, upper); } /* Change case of region. Lower case if EXP < 0, else upper case. */ DEF_CMD( "case-region-capitalize", CaseReg, EDIT|ARG(2) ); DEF_CMD( "case-region-upper", CaseReg, EDIT ); DEF_CMD( "case-region-lower", CaseReg, EDIT|NEGATE ) { Bufpos savedot; DOTsave(&savedot); if (True(SaveRegion)) CopyRegion(); /* so you can undo it */ case_reg(to_mark, (exp == 0 || (LastCmd->Type & ARG(2))) ? capitalize : (exp > 0) ? upper : lower); SetDot(&savedot); } DEF_CMD( "case-word-capitalize", CaseWord, EDIT|ARG(2) ); DEF_CMD( "case-word-upper", CaseWord, EDIT|ARG(1) ); DEF_CMD( "case-word-lower", CaseWord, EDIT|ARG(0) ) { case_reg(ForWord, (LastCmd->Type & ARG(2)) ? capitalize : (LastCmd->Type & ARG(1)) ? upper : lower); } /*====================================================================== * $Log: case.c,v $ * Revision 14.30.0.10 1994/04/22 18:13:49 tom * (CaseReg): add "case-region-capitalize". * * Revision 14.30 1993/01/26 18:43:08 tom * cleanup whitespace. * * Revision 14.26 1992/08/26 23:56:51 tom * add RCS directives. * */