diff options
Diffstat (limited to 'editors')
-rw-r--r-- | editors/ed.c | 259 |
1 files changed, 127 insertions, 132 deletions
diff --git a/editors/ed.c b/editors/ed.c index 9606cfdde..2f3bf03bf 100644 --- a/editors/ed.c +++ b/editors/ed.c | |||
@@ -119,7 +119,7 @@ int ed_main(int argc ATTRIBUTE_UNUSED, char **argv) | |||
119 | static void doCommands(void) | 119 | static void doCommands(void) |
120 | { | 120 | { |
121 | const char *cp; | 121 | const char *cp; |
122 | char *endbuf, *newname, buf[USERSIZE]; | 122 | char *endbuf, buf[USERSIZE]; |
123 | int len, num1, num2; | 123 | int len, num1, num2; |
124 | smallint have1, have2; | 124 | smallint have1, have2; |
125 | 125 | ||
@@ -168,162 +168,157 @@ static void doCommands(void) | |||
168 | num2 = num1; | 168 | num2 = num1; |
169 | 169 | ||
170 | switch (*cp++) { | 170 | switch (*cp++) { |
171 | case 'a': | 171 | case 'a': |
172 | addLines(num1 + 1); | 172 | addLines(num1 + 1); |
173 | break; | 173 | break; |
174 | 174 | ||
175 | case 'c': | 175 | case 'c': |
176 | deleteLines(num1, num2); | 176 | deleteLines(num1, num2); |
177 | addLines(num1); | 177 | addLines(num1); |
178 | break; | 178 | break; |
179 | 179 | ||
180 | case 'd': | 180 | case 'd': |
181 | deleteLines(num1, num2); | 181 | deleteLines(num1, num2); |
182 | break; | 182 | break; |
183 | 183 | ||
184 | case 'f': | 184 | case 'f': |
185 | if (*cp && !isblank(*cp)) { | 185 | if (*cp && !isblank(*cp)) { |
186 | bb_error_msg("bad file command"); | 186 | bb_error_msg("bad file command"); |
187 | break; | ||
188 | } | ||
189 | cp = skip_blank(cp); | ||
190 | if (*cp == '\0') { | ||
191 | if (fileName) | ||
192 | printf("\"%s\"\n", fileName); | ||
193 | else | ||
194 | printf("No file name\n"); | ||
195 | break; | ||
196 | } | ||
197 | newname = strdup(cp); | ||
198 | if (newname == NULL) { | ||
199 | bb_error_msg("no memory for file name"); | ||
200 | break; | ||
201 | } | ||
202 | free(fileName); | ||
203 | fileName = newname; | ||
204 | break; | 187 | break; |
205 | 188 | } | |
206 | case 'i': | 189 | cp = skip_blank(cp); |
207 | addLines(num1); | 190 | if (*cp == '\0') { |
191 | if (fileName) | ||
192 | printf("\"%s\"\n", fileName); | ||
193 | else | ||
194 | printf("No file name\n"); | ||
208 | break; | 195 | break; |
196 | } | ||
197 | free(fileName); | ||
198 | fileName = xstrdup(cp); | ||
199 | break; | ||
209 | 200 | ||
210 | case 'k': | 201 | case 'i': |
211 | cp = skip_blank(cp); | 202 | addLines(num1); |
212 | if ((*cp < 'a') || (*cp > 'z') || cp[1]) { | 203 | break; |
213 | bb_error_msg("bad mark name"); | ||
214 | break; | ||
215 | } | ||
216 | marks[*cp - 'a'] = num2; | ||
217 | break; | ||
218 | 204 | ||
219 | case 'l': | 205 | case 'k': |
220 | printLines(num1, num2, TRUE); | 206 | cp = skip_blank(cp); |
207 | if ((*cp < 'a') || (*cp > 'z') || cp[1]) { | ||
208 | bb_error_msg("bad mark name"); | ||
221 | break; | 209 | break; |
210 | } | ||
211 | marks[*cp - 'a'] = num2; | ||
212 | break; | ||
222 | 213 | ||
223 | case 'p': | 214 | case 'l': |
224 | printLines(num1, num2, FALSE); | 215 | printLines(num1, num2, TRUE); |
225 | break; | 216 | break; |
226 | 217 | ||
227 | case 'q': | 218 | case 'p': |
228 | cp = skip_blank(cp); | 219 | printLines(num1, num2, FALSE); |
229 | if (have1 || *cp) { | 220 | break; |
230 | bb_error_msg("bad quit command"); | ||
231 | break; | ||
232 | } | ||
233 | if (!dirty) | ||
234 | return; | ||
235 | len = read_line_input("Really quit? ", buf, 16, NULL); | ||
236 | /* read error/EOF - no way to continue */ | ||
237 | if (len < 0) | ||
238 | return; | ||
239 | cp = skip_blank(buf); | ||
240 | if ((*cp | 0x20) == 'y') /* Y or y */ | ||
241 | return; | ||
242 | break; | ||
243 | 221 | ||
244 | case 'r': | 222 | case 'q': |
245 | if (*cp && !isblank(*cp)) { | 223 | cp = skip_blank(cp); |
246 | bb_error_msg("bad read command"); | 224 | if (have1 || *cp) { |
247 | break; | 225 | bb_error_msg("bad quit command"); |
248 | } | ||
249 | cp = skip_blank(cp); | ||
250 | if (*cp == '\0') { | ||
251 | bb_error_msg("no file name"); | ||
252 | break; | ||
253 | } | ||
254 | if (!have1) | ||
255 | num1 = lastNum; | ||
256 | if (readLines(cp, num1 + 1)) | ||
257 | break; | ||
258 | if (fileName == NULL) | ||
259 | fileName = strdup(cp); | ||
260 | break; | 226 | break; |
227 | } | ||
228 | if (!dirty) | ||
229 | return; | ||
230 | len = read_line_input("Really quit? ", buf, 16, NULL); | ||
231 | /* read error/EOF - no way to continue */ | ||
232 | if (len < 0) | ||
233 | return; | ||
234 | cp = skip_blank(buf); | ||
235 | if ((*cp | 0x20) == 'y') /* Y or y */ | ||
236 | return; | ||
237 | break; | ||
261 | 238 | ||
262 | case 's': | 239 | case 'r': |
263 | subCommand(cp, num1, num2); | 240 | if (*cp && !isblank(*cp)) { |
241 | bb_error_msg("bad read command"); | ||
264 | break; | 242 | break; |
265 | 243 | } | |
266 | case 'w': | 244 | cp = skip_blank(cp); |
267 | if (*cp && !isblank(*cp)) { | 245 | if (*cp == '\0') { |
268 | bb_error_msg("bad write command"); | 246 | bb_error_msg("no file name"); |
269 | break; | ||
270 | } | ||
271 | cp = skip_blank(cp); | ||
272 | if (!have1) { | ||
273 | num1 = 1; | ||
274 | num2 = lastNum; | ||
275 | } | ||
276 | if (*cp == '\0') | ||
277 | cp = fileName; | ||
278 | if (cp == NULL) { | ||
279 | bb_error_msg("no file name specified"); | ||
280 | break; | ||
281 | } | ||
282 | writeLines(cp, num1, num2); | ||
283 | break; | 247 | break; |
284 | 248 | } | |
285 | case 'z': | 249 | if (!have1) |
286 | switch (*cp) { | 250 | num1 = lastNum; |
287 | case '-': | 251 | if (readLines(cp, num1 + 1)) |
288 | printLines(curNum - 21, curNum, FALSE); | ||
289 | break; | ||
290 | case '.': | ||
291 | printLines(curNum - 11, curNum + 10, FALSE); | ||
292 | break; | ||
293 | default: | ||
294 | printLines(curNum, curNum + 21, FALSE); | ||
295 | break; | ||
296 | } | ||
297 | break; | 252 | break; |
253 | if (fileName == NULL) | ||
254 | fileName = xstrdup(cp); | ||
255 | break; | ||
298 | 256 | ||
299 | case '.': | 257 | case 's': |
300 | if (have1) { | 258 | subCommand(cp, num1, num2); |
301 | bb_error_msg("no arguments allowed"); | 259 | break; |
302 | break; | 260 | |
303 | } | 261 | case 'w': |
304 | printLines(curNum, curNum, FALSE); | 262 | if (*cp && !isblank(*cp)) { |
263 | bb_error_msg("bad write command"); | ||
264 | break; | ||
265 | } | ||
266 | cp = skip_blank(cp); | ||
267 | if (!have1) { | ||
268 | num1 = 1; | ||
269 | num2 = lastNum; | ||
270 | } | ||
271 | if (*cp == '\0') | ||
272 | cp = fileName; | ||
273 | if (cp == NULL) { | ||
274 | bb_error_msg("no file name specified"); | ||
305 | break; | 275 | break; |
276 | } | ||
277 | writeLines(cp, num1, num2); | ||
278 | break; | ||
306 | 279 | ||
280 | case 'z': | ||
281 | switch (*cp) { | ||
307 | case '-': | 282 | case '-': |
308 | if (setCurNum(curNum - 1)) | 283 | printLines(curNum - 21, curNum, FALSE); |
309 | printLines(curNum, curNum, FALSE); | ||
310 | break; | 284 | break; |
311 | 285 | case '.': | |
312 | case '=': | 286 | printLines(curNum - 11, curNum + 10, FALSE); |
313 | printf("%d\n", num1); | ||
314 | break; | 287 | break; |
315 | case '\0': | 288 | default: |
316 | if (have1) { | 289 | printLines(curNum, curNum + 21, FALSE); |
317 | printLines(num2, num2, FALSE); | ||
318 | break; | ||
319 | } | ||
320 | if (setCurNum(curNum + 1)) | ||
321 | printLines(curNum, curNum, FALSE); | ||
322 | break; | 290 | break; |
291 | } | ||
292 | break; | ||
323 | 293 | ||
324 | default: | 294 | case '.': |
325 | bb_error_msg("unimplemented command"); | 295 | if (have1) { |
296 | bb_error_msg("no arguments allowed"); | ||
297 | break; | ||
298 | } | ||
299 | printLines(curNum, curNum, FALSE); | ||
300 | break; | ||
301 | |||
302 | case '-': | ||
303 | if (setCurNum(curNum - 1)) | ||
304 | printLines(curNum, curNum, FALSE); | ||
305 | break; | ||
306 | |||
307 | case '=': | ||
308 | printf("%d\n", num1); | ||
309 | break; | ||
310 | case '\0': | ||
311 | if (have1) { | ||
312 | printLines(num2, num2, FALSE); | ||
326 | break; | 313 | break; |
314 | } | ||
315 | if (setCurNum(curNum + 1)) | ||
316 | printLines(curNum, curNum, FALSE); | ||
317 | break; | ||
318 | |||
319 | default: | ||
320 | bb_error_msg("unimplemented command"); | ||
321 | break; | ||
327 | } | 322 | } |
328 | } | 323 | } |
329 | } | 324 | } |