|
|
1.1 root 1: /***************************************************************************
2: * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne. JOVE *
3: * is 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 "disp.h"
10: #include "ctype.h"
11:
12: private int
13: # if !(defined(IBMPC) || defined(MAC))
14: lower proto((char *)),
15: # endif
16: upper proto((char *));
17:
18: private void
19: CaseReg proto((int up)),
20: case_reg proto((struct line *line1,int char1,struct line *line2,int char2,int up)),
21: case_word proto((int up));
22:
23: void
24: CapChar()
25: {
26: register int num,
27: restore = NO;
28: Bufpos b;
29:
30: DOTsave(&b);
31:
32: num = arg_value();
33: if (num < 0) {
34: restore = YES;
35: num = -num;
36: b_char(num); /* Cap previous EXP chars */
37: }
38: while (num--) {
39: if (upper(&linebuf[curchar])) {
40: modify();
41: makedirty(curline);
42: }
43: if (eolp()) {
44: if (curline->l_next == 0)
45: break;
46: SetLine(curline->l_next);
47: } else
48: curchar += 1;
49: }
50: if (restore)
51: SetDot(&b);
52: }
53:
54: void
55: CapWord()
56: {
57: register int num,
58: restore = NO;
59: Bufpos b;
60:
61: DOTsave(&b);
62: num = arg_value();
63: if (num < 0) {
64: restore = YES;
65: num = -num;
66: b_word(num); /* Cap previous EXP words */
67: }
68: while (num--) {
69: to_word(1); /* Go to the beginning of the next word. */
70: if (eobp())
71: break;
72: if (upper(&linebuf[curchar])) {
73: modify();
74: makedirty(curline);
75: }
76: curchar += 1;
77: while (!eolp() && isword(linebuf[curchar])) {
78: if (lower(&linebuf[curchar])) {
79: modify();
80: makedirty(curline);
81: }
82: curchar += 1;
83: }
84: }
85: if (restore)
86: SetDot(&b);
87: }
88:
89: private void
90: case_word(up)
91: int up;
92: {
93: Bufpos before;
94:
95: DOTsave(&before);
96: ForWord(); /* this'll go backward if negative argument */
97: case_reg(before.p_line, before.p_char, curline, curchar, up);
98: }
99:
100: private int
101: upper(c)
102: register char *c;
103: {
104: if (islower(*c)) {
105: #if !defined(ASCII) /* check for IBM extended character set */
106: if (*c <= 127)
107: #endif /* ASCII */
108: *c -= ' ';
109: #if defined(IBMPC) /* ... and change Umlaute */
110: else
111: switch (*c) {
112: case 129: *c = 154; break; /* ue */
113: case 132: *c = 142; break; /* ae */
114: case 148: *c = 153; break; /* oe */
115: }
116: #endif /* IBMPC */
117: #if defined(MAC)
118: else *c = CaseEquiv[*c];
119: #endif
120: return 1;
121: }
122: return 0;
123: }
124:
125: #if !(defined(IBMPC) || defined(MAC))
126: private
127: #endif
128: int
129: lower(c)
130: char *c;
131: {
132: if (isupper(*c)) {
133: #if !defined(ASCII)
134: if (*c <= 127)
135: #endif /* ASCII */
136: *c += ' ';
137: #if defined(IBMPC)
138: else
139: switch (*c) {
140: case 142: *c = 132; break; /* Ae */
141: case 153: *c = 148; break; /* Oe */
142: case 154: *c = 129; break; /* Ue */
143: }
144: #endif /* IBMPC */
145: #if defined(MAC)
146: else {
147: int n;
148:
149: for(n = 128; n < 256; n++) {
150: if((CaseEquiv[n] == *c) && islower(n)) {
151: *c = n;
152: break;
153: }
154: }
155: if(n > 255) return(0);
156: }
157: #endif /* MAC */
158: return 1;
159: }
160: return 0;
161: }
162:
163: private void
164: case_reg(line1, char1, line2, char2, up)
165: Line *line1,
166: *line2;
167: int char1,
168: char2,
169: up;
170: {
171: (void) fixorder(&line1, &char1, &line2, &char2);
172: DotTo(line1, char1);
173:
174: for (;;) {
175: if (curline == line2 && curchar == char2)
176: break;
177: if (!eolp())
178: if ((up) ? upper(&linebuf[curchar]) : lower(&linebuf[curchar])) {
179: makedirty(curline);
180: modify();
181: }
182: f_char(1);
183: }
184: }
185:
186: void
187: CasRegLower()
188: {
189: CaseReg(0);
190: }
191:
192: void
193: CasRegUpper()
194: {
195: CaseReg(1);
196: }
197:
198: private void
199: CaseReg(up)
200: int up;
201: {
202: register Mark *mp = CurMark();
203: Bufpos savedot;
204:
205: DOTsave(&savedot);
206: case_reg(curline, curchar, mp->m_line, mp->m_char, up);
207: SetDot(&savedot);
208: }
209:
210: void
211: UppWord()
212: {
213: case_word(1);
214: }
215:
216: void
217: LowWord()
218: {
219: case_word(0);
220: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.