1/* main.c: This file contains the main control and user-interface routines 2 for the ed line editor. */ 3/*- 4 * Copyright (c) 1993 Andrew Moore, Talke Studio. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions --- 11 unchanged lines hidden (view full) --- 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 * |
28 * $Id: main.c,v 1.5 1995/05/30 00:06:47 rgrimes Exp $ |
29 */ 30 31#ifndef lint 32char *copyright = 33"@(#) Copyright (c) 1993 Andrew Moore, Talke Studio. \n\ 34 All rights reserved.\n"; 35#endif /* not lint */ 36 --- 17 unchanged lines hidden (view full) --- 54 * 55 */ 56 57#include <sys/ioctl.h> 58#include <sys/wait.h> 59#include <ctype.h> 60#include <setjmp.h> 61#include <pwd.h> |
62#include <locale.h> |
63 64#include "ed.h" 65 66 67#ifdef _POSIX_SOURCE 68sigjmp_buf env; 69#else 70jmp_buf env; --- 37 unchanged lines hidden (view full) --- 108int 109main(argc, argv) 110 int argc; 111 char **argv; 112{ 113 int c, n; 114 long status = 0; 115 |
116 (void)setlocale(LC_ALL, ""); 117 |
118 red = (n = strlen(argv[0])) > 2 && argv[0][n - 3] == 'r'; 119top: 120 while ((c = getopt(argc, argv, "p:sx")) != EOF) 121 switch(c) { 122 case 'p': /* set prompt */ 123 prompt = optarg; 124 break; 125 case 's': /* run script */ --- 152 unchanged lines hidden (view full) --- 278 current_addr = addr; 279 } 280 if ((addr_cnt = min(addr_cnt, 2)) == 1 || second_addr != addr) 281 first_addr = second_addr; 282 return (addr == ERR) ? ERR : 0; 283} 284 285 |
286#define SKIP_BLANKS() while (isspace((unsigned char)*ibufp) && *ibufp != '\n') ibufp++ |
287 288#define MUST_BE_FIRST() \ 289 if (!first) { sprintf(errmsg, "invalid address"); return ERR; } 290 291/* next_addr: return the next line address in the command buffer */ 292long 293next_addr() 294{ --- 8 unchanged lines hidden (view full) --- 303 switch (c = *ibufp) { 304 case '+': 305 case '\t': 306 case ' ': 307 case '-': 308 case '^': 309 ibufp++; 310 SKIP_BLANKS(); |
311 if (isdigit((unsigned char)*ibufp)) { |
312 STRTOL(n, ibufp); 313 addr += (c == '-' || c == '^') ? -n : n; |
314 } else if (!isspace((unsigned char)c)) |
315 addr += (c == '-' || c == '^') ? -1 : 1; 316 break; 317 case '0': case '1': case '2': 318 case '3': case '4': case '5': 319 case '6': case '7': case '8': case '9': 320 MUST_BE_FIRST(); 321 STRTOL(addr, ibufp); 322 break; --- 165 unchanged lines hidden (view full) --- 488 case 'e': 489 if (modified && !scripted) 490 return EMOD; 491 /* fall through */ 492 case 'E': 493 if (addr_cnt > 0) { 494 sprintf(errmsg, "unexpected address"); 495 return ERR; |
496 } else if (!isspace((unsigned char)*ibufp)) { |
497 sprintf(errmsg, "unexpected command suffix"); 498 return ERR; 499 } else if ((fnp = get_filename()) == NULL) 500 return ERR; 501 GET_COMMAND_SUFFIX(); 502 if (delete_lines(1, addr_last) < 0) 503 return ERR; 504 clear_undo_stack(); --- 13 unchanged lines hidden (view full) --- 518 clear_undo_stack(); 519 modified = 0; 520 u_current_addr = u_addr_last = -1; 521 break; 522 case 'f': 523 if (addr_cnt > 0) { 524 sprintf(errmsg, "unexpected address"); 525 return ERR; |
526 } else if (!isspace((unsigned char)*ibufp)) { |
527 sprintf(errmsg, "unexpected command suffix"); 528 return ERR; 529 } else if ((fnp = get_filename()) == NULL) 530 return ERR; 531 else if (*fnp == '!') { 532 sprintf(errmsg, "invalid redirection"); 533 return ERR; 534 } --- 114 unchanged lines hidden (view full) --- 649 if (addr_cnt > 0) { 650 sprintf(errmsg, "unexpected address"); 651 return ERR; 652 } 653 GET_COMMAND_SUFFIX(); 654 gflag = (modified && !scripted && c == 'q') ? EMOD : EOF; 655 break; 656 case 'r': |
657 if (!isspace((unsigned char)*ibufp)) { |
658 sprintf(errmsg, "unexpected command suffix"); 659 return ERR; 660 } else if (addr_cnt == 0) 661 second_addr = addr_last; 662 if ((fnp = get_filename()) == NULL) 663 return ERR; 664 GET_COMMAND_SUFFIX(); 665 if (!isglobal) clear_undo_stack(); --- 116 unchanged lines hidden (view full) --- 782 return ERR; 783 break; 784 case 'w': 785 case 'W': 786 if ((n = *ibufp) == 'q' || n == 'Q') { 787 gflag = EOF; 788 ibufp++; 789 } |
790 if (!isspace((unsigned char)*ibufp)) { |
791 sprintf(errmsg, "unexpected command suffix"); 792 return ERR; 793 } else if ((fnp = get_filename()) == NULL) 794 return ERR; 795 if (addr_cnt == 0 && !addr_last) 796 first_addr = second_addr = 0; 797 else if (check_addr_range(1, addr_last) < 0) 798 return ERR; --- 459 unchanged lines hidden (view full) --- 1258int markno; /* line marker count */ 1259 1260/* mark_line_node: set a line node mark */ 1261int 1262mark_line_node(lp, n) 1263 line_t *lp; 1264 int n; 1265{ |
1266 if (!islower((unsigned char)n)) { |
1267 sprintf(errmsg, "invalid mark character"); 1268 return ERR; 1269 } else if (mark[n - 'a'] == NULL) 1270 markno++; 1271 mark[n - 'a'] = lp; 1272 return 0; 1273} 1274 1275 1276/* get_marked_node_addr: return address of a marked line */ 1277long 1278get_marked_node_addr(n) 1279 int n; 1280{ |
1281 if (!islower((unsigned char)n)) { |
1282 sprintf(errmsg, "invalid mark character"); 1283 return ERR; 1284 } 1285 return get_line_node_addr(mark[n - 'a']); 1286} 1287 1288 1289/* unmark_line_node: clear line node mark */ --- 148 unchanged lines hidden --- |