home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume8 / jove / part01 / case.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-02-02  |  2.5 KB  |  166 lines

  1. /************************************************************************
  2.  * This program is Copyright (C) 1986 by Jonathan Payne.  JOVE is       *
  3.  * provided to you without charge, and with no warranty.  You may give  *
  4.  * away copies of JOVE, including sources, provided that this notice is *
  5.  * included in all the files.                                           *
  6.  ************************************************************************/
  7.  
  8. #include "jove.h"
  9. #include "ctype.h"
  10.  
  11. CapChar()
  12. {
  13.     register int    num,
  14.             restore = 0;
  15.     Bufpos    b;
  16.  
  17.     DOTsave(&b);
  18.  
  19.     if (exp < 0) {
  20.         restore++;
  21.         exp = -exp;
  22.         num = exp;
  23.         BackChar();    /* Cap previous EXP chars */
  24.     } else
  25.         num = exp;
  26.         
  27.     exp = 1;    /* So all the commands are done once */
  28.  
  29.     while (num--) {
  30.         if (upper(&linebuf[curchar])) {
  31.             modify();
  32.             makedirty(curline);
  33.         }
  34.         if (eolp()) {
  35.             if (curline->l_next == 0)
  36.                 break;
  37.             SetLine(curline->l_next);
  38.         }
  39.         else
  40.             curchar++;
  41.     }
  42.     if (restore)
  43.         SetDot(&b);
  44. }
  45.  
  46. CapWord()
  47. {
  48.     register int    num,
  49.             restore = 0;
  50.     Bufpos    b;
  51.  
  52.     DOTsave(&b);
  53.  
  54.     if (exp < 0) {
  55.         restore++;
  56.         exp = -exp;
  57.         num = exp;
  58.         BackWord();    /* Cap previous EXP words */
  59.     } else
  60.         num = exp;
  61.         
  62.     exp = 1;    /* So all the commands are done once */
  63.  
  64.     while (num--) {
  65.         to_word(1);    /* Go to the beginning of the next word. */
  66.         if (eobp())
  67.             break;
  68.         if (upper(&linebuf[curchar])) {
  69.             modify();
  70.             makedirty(curline);
  71.         }
  72.         curchar++;
  73.         while (!eolp() && isword(linebuf[curchar])) {
  74.             if (lower(&linebuf[curchar])) {
  75.                 modify();
  76.                 makedirty(curline);
  77.             }
  78.             curchar++;
  79.         }
  80.     }
  81.     if (restore)
  82.         SetDot(&b);
  83. }
  84.  
  85. case_word(up)
  86. {
  87.     Bufpos    before;
  88.  
  89.     DOTsave(&before);
  90.     ForWord();    /* This'll go backward if negative argument. */
  91.     case_reg(before.p_line, before.p_char, curline, curchar, up);
  92. }
  93.  
  94. static
  95. upper(c)
  96. register char    *c;
  97. {
  98.     if (islower(*c)) {
  99.         *c -= ' ';
  100.         return 1;
  101.     }
  102.     return 0;
  103. }
  104.  
  105. static
  106. lower(c)
  107. register char    *c;
  108. {
  109.     if (isupper(*c)) {
  110.         *c += ' ';
  111.         return 1;
  112.     }
  113.     return 0;
  114. }
  115.  
  116. case_reg(line1, char1, line2, char2, up)
  117. Line    *line1,
  118.     *line2;
  119. int    char1;
  120. {
  121.     (void) fixorder(&line1, &char1, &line2, &char2);
  122.     DotTo(line1, char1);
  123.  
  124.     exp = 1;
  125.     for (;;) {
  126.         if (curline == line2 && curchar == char2)
  127.             break;
  128.         if (!eolp())
  129.             if ((up) ? upper(&linebuf[curchar]) : lower(&linebuf[curchar])) {
  130.                 makedirty(curline);
  131.                 modify();
  132.             }
  133.         ForChar();
  134.     }
  135. }
  136.  
  137. CasRegLower()
  138. {
  139.     CaseReg(0);
  140. }
  141.  
  142. CasRegUpper()
  143. {
  144.     CaseReg(1);
  145. }
  146.  
  147. CaseReg(up)
  148. {
  149.     register Mark    *mp = CurMark();
  150.     Bufpos    savedot;
  151.  
  152.     DOTsave(&savedot);
  153.     case_reg(curline, curchar, mp->m_line, mp->m_char, up);
  154.     SetDot(&savedot);
  155. }
  156.  
  157. UppWord()
  158. {
  159.     case_word(1);
  160. }
  161.  
  162. LowWord()
  163. {
  164.     case_word(0);
  165. }
  166.