Mercurial > hg > Members > kono > nitros9-code
comparison 3rdparty/packages/uemacs/ueregion.c @ 995:48c646212b1c
'microEMACS' for OS-9.
Posted to USENET net.micro.6809, 4-May-86. Picked up from Google groups
author | roug |
---|---|
date | Sun, 23 Feb 2003 21:26:32 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
994:bef1844de0dc | 995:48c646212b1c |
---|---|
1 /* | |
2 * The routines in this file | |
3 * deal with the region, that magic space | |
4 * between "." and mark. Some functions are | |
5 * commands. Some functions are just for | |
6 * internal use. | |
7 */ | |
8 #include <stdio.h> | |
9 #include "ueed.h" | |
10 | |
11 /* | |
12 * Kill the region. Ask "getregion" | |
13 * to figure out the bounds of the region. | |
14 * Move "." to the start, and kill the characters. | |
15 * Bound to "C-W". | |
16 */ | |
17 killregion(f, n) | |
18 { | |
19 register int s; | |
20 REGION region; | |
21 | |
22 if ((s=getregion(®ion)) != TRUE) | |
23 return (s); | |
24 if ((lastflag&CFKILL) == 0) /* This is a kill type */ | |
25 kdelete(); /* command, so do magic */ | |
26 thisflag |= CFKILL; /* kill buffer stuff. */ | |
27 curwp->w_dotp = region.r_linep; | |
28 curwp->w_doto = region.r_offset; | |
29 return (ldelete(region.r_size, TRUE)); | |
30 } | |
31 | |
32 /* | |
33 * Copy all of the characters in the | |
34 * region to the kill buffer. Don't move dot | |
35 * at all. This is a bit like a kill region followed | |
36 * by a yank. Bound to "M-W". | |
37 */ | |
38 copyregion(f, n) | |
39 { | |
40 register LINE *linep; | |
41 register int loffs; | |
42 register int s; | |
43 REGION region; | |
44 | |
45 if ((s=getregion(®ion)) != TRUE) | |
46 return (s); | |
47 if ((lastflag&CFKILL) == 0) /* Kill type command. */ | |
48 kdelete(); | |
49 thisflag |= CFKILL; | |
50 linep = region.r_linep; /* Current line. */ | |
51 loffs = region.r_offset; /* Current offset. */ | |
52 while (region.r_size--) { | |
53 if (loffs == llength(linep)) { /* End of line. */ | |
54 if ((s=kinsert('\n')) != TRUE) | |
55 return (s); | |
56 linep = lforw(linep); | |
57 loffs = 0; | |
58 } else { /* Middle of line. */ | |
59 if ((s=kinsert(lgetc(linep, loffs))) != TRUE) | |
60 return (s); | |
61 ++loffs; | |
62 } | |
63 } | |
64 return (TRUE); | |
65 } | |
66 | |
67 /* | |
68 * Lower case region. Zap all of the upper | |
69 * case characters in the region to lower case. Use | |
70 * the region code to set the limits. Scan the buffer, | |
71 * doing the changes. Call "lchange" to ensure that | |
72 * redisplay is done in all buffers. Bound to | |
73 * "C-X C-L". | |
74 */ | |
75 lowerregion(f, n) | |
76 { | |
77 register LINE *linep; | |
78 register int loffs; | |
79 register int c; | |
80 register int s; | |
81 REGION region; | |
82 | |
83 if ((s=getregion(®ion)) != TRUE) | |
84 return (s); | |
85 lchange(WFHARD); | |
86 linep = region.r_linep; | |
87 loffs = region.r_offset; | |
88 while (region.r_size--) { | |
89 if (loffs == llength(linep)) { | |
90 linep = lforw(linep); | |
91 loffs = 0; | |
92 } else { | |
93 c = lgetc(linep, loffs); | |
94 if (c>='A' && c<='Z') | |
95 lputc(linep, loffs, c+'a'-'A'); | |
96 ++loffs; | |
97 } | |
98 } | |
99 return (TRUE); | |
100 } | |
101 | |
102 /* | |
103 * Upper case region. Zap all of the lower | |
104 * case characters in the region to upper case. Use | |
105 * the region code to set the limits. Scan the buffer, | |
106 * doing the changes. Call "lchange" to ensure that | |
107 * redisplay is done in all buffers. Bound to | |
108 * "C-X C-L". | |
109 */ | |
110 upperregion(f, n) | |
111 { | |
112 register LINE *linep; | |
113 register int loffs; | |
114 register int c; | |
115 register int s; | |
116 REGION region; | |
117 | |
118 if ((s=getregion(®ion)) != TRUE) | |
119 return (s); | |
120 lchange(WFHARD); | |
121 linep = region.r_linep; | |
122 loffs = region.r_offset; | |
123 while (region.r_size--) { | |
124 if (loffs == llength(linep)) { | |
125 linep = lforw(linep); | |
126 loffs = 0; | |
127 } else { | |
128 c = lgetc(linep, loffs); | |
129 if (c>='a' && c<='z') | |
130 lputc(linep, loffs, c-'a'+'A'); | |
131 ++loffs; | |
132 } | |
133 } | |
134 return (TRUE); | |
135 } | |
136 | |
137 /* | |
138 * This routine figures out the | |
139 * bounds of the region in the current window, and | |
140 * fills in the fields of the "REGION" structure pointed | |
141 * to by "rp". Because the dot and mark are usually very | |
142 * close together, we scan outward from dot looking for | |
143 * mark. This should save time. Return a standard code. | |
144 * Callers of this routine should be prepared to get | |
145 * an "ABORT" status; we might make this have the | |
146 * conform thing later. | |
147 */ | |
148 getregion(rp) | |
149 register REGION *rp; | |
150 { | |
151 register LINE *flp; | |
152 register LINE *blp; | |
153 register int fsize; | |
154 register int bsize; | |
155 | |
156 if (curwp->w_markp == NULL) { | |
157 mlwrite("No mark set in this window"); | |
158 return (FALSE); | |
159 } | |
160 if (curwp->w_dotp == curwp->w_markp) { | |
161 rp->r_linep = curwp->w_dotp; | |
162 if (curwp->w_doto < curwp->w_marko) { | |
163 rp->r_offset = curwp->w_doto; | |
164 rp->r_size = curwp->w_marko-curwp->w_doto; | |
165 } else { | |
166 rp->r_offset = curwp->w_marko; | |
167 rp->r_size = curwp->w_doto-curwp->w_marko; | |
168 } | |
169 return (TRUE); | |
170 } | |
171 blp = curwp->w_dotp; | |
172 bsize = curwp->w_doto; | |
173 flp = curwp->w_dotp; | |
174 fsize = llength(flp)-curwp->w_doto+1; | |
175 while (flp!=curbp->b_linep || lback(blp)!=curbp->b_linep) { | |
176 if (flp != curbp->b_linep) { | |
177 flp = lforw(flp); | |
178 if (flp == curwp->w_markp) { | |
179 rp->r_linep = curwp->w_dotp; | |
180 rp->r_offset = curwp->w_doto; | |
181 rp->r_size = fsize+curwp->w_marko; | |
182 return (TRUE); | |
183 } | |
184 fsize += llength(flp)+1; | |
185 } | |
186 if (lback(blp) != curbp->b_linep) { | |
187 blp = lback(blp); | |
188 bsize += llength(blp)+1; | |
189 if (blp == curwp->w_markp) { | |
190 rp->r_linep = blp; | |
191 rp->r_offset = curwp->w_marko; | |
192 rp->r_size = bsize - curwp->w_marko; | |
193 return (TRUE); | |
194 } | |
195 } | |
196 } | |
197 mlwrite("Bug: lost mark"); | |
198 return (FALSE); | |
199 } | |
200 | |
201 |