Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.3 4.3bsd-beta 6/6/85; site amdcad.UUCP Path: utzoo!watmath!clyde!cbosgd!ihnp4!amdcad!jimb From: jimb@amdcad.UUCP (Jim Budler) Newsgroups: net.sources Subject: Re: less, part 1 of 2 Message-ID: <4137@amdcad.UUCP> Date: Wed, 18-Sep-85 20:30:48 EDT Article-I.D.: amdcad.4137 Posted: Wed Sep 18 20:30:48 1985 Date-Received: Fri, 20-Sep-85 03:50:55 EDT References: <478@nsc-pdc.UUCP> Reply-To: jimb@amdcad.UUCP (Jim Budler) Organization: AMD, Sunnyvale, California Lines: 225 I made a few changes to version 40, which I called 40a and 40b. 40a : Allows a terminal without reverse scroll or insert line to use less with the penalty of repainting the screen after every upward scroll command. i.e. if you go up one page the screen is repainted, but if you go up one line it is also repainted. It still works the same way it did when used with a smarter terminal. 40b : Used execl() instead of system() to call the editor. Added some signal handling around the fork() call to allow all this to work properly if you enter the editor, then stop the editor. One bad hack: I #defined vfork() fork() near the beginning of command.c. I should have done it in the Makefile. ----------------------< cut here >---------------------------------- *** /tmp/,RCSt1011254 Wed Sep 18 15:37:20 1985 --- command.c Wed Sep 18 13:52:56 1985 *************** *** 3,8 */ #include "less.h" extern int erase_char, kill_char; extern int pr_type; --- 3,11 ----- */ #include "less.h" + #include + #include + #define fork() vfork() extern int erase_char, kill_char; extern int pr_type; *************** *** 204,209 register int n; register int scroll = 10; register int last_mcc = 0; mcc = 0; --- 207,213 ----- register int n; register int scroll = 10; register int last_mcc = 0; + int id; mcc = 0; *************** *** 509,516 clear_eol(); flush(); raw_mode(0); ! sprintf(cmdbuf, "%s %s", editor, current_file); ! system(cmdbuf); raw_mode(1); first_cmd = "R"; break; --- 513,531 ----- clear_eol(); flush(); raw_mode(0); ! if ( fork() == 0 ) { ! execl(editor, editor, current_file, 0 ); ! write ( 2, "exec failed\n", 12); ! _exit(1); ! } ! signal(SIGINT,SIG_IGN); ! signal(SIGQUIT,SIG_IGN); ! #ifdef SIGTSTP ! signal(SIGTSTP,SIG_DFL); ! #endif ! ! wait(0); ! init_signals(); raw_mode(1); first_cmd = "R"; break; *** /tmp/,RCSt1011265 Wed Sep 18 15:38:21 1985 --- prim.c Thu Sep 12 14:50:24 1985 *************** *** 6,11 #include "position.h" public int hit_eof; extern int quiet; extern int top_search; --- 6,12 ----- #include "position.h" public int hit_eof; + extern int noaddline; extern int quiet; extern int top_search; *************** *** 116,124 * Display the line on the screen. */ add_back_pos(pos); ! home(); ! add_line(); ! put_line(); } } --- 117,131 ----- * Display the line on the screen. */ add_back_pos(pos); ! if ( noaddline == 0 ) { ! home(); ! add_line(); ! put_line(); ! } ! } ! if ( noaddline == 1) { ! clear(); ! repaint(); } } *** /tmp/,RCSt1011277 Wed Sep 18 15:40:09 1985 --- screen.c Thu Sep 12 15:17:11 1985 *************** *** 39,44 static int dumb; static int hard; public int auto_wrap; /* Terminal does \r\n when write past margin */ public int ignaw; /* Terminal ignores \n immediately after wrap */ public int erase_char, kill_char; /* The user's erase and line-kill chars */ --- 39,45 ----- static int dumb; static int hard; + public int auto_wrap; /* Terminal does \r\n when write past margin */ public int ignaw; /* Terminal ignores \n immediately after wrap */ public int noaddline = 0; /* Terminal doesn't reverse scroll */ *************** *** 41,46 public int auto_wrap; /* Terminal does \r\n when write past margin */ public int ignaw; /* Terminal ignores \n immediately after wrap */ public int erase_char, kill_char; /* The user's erase and line-kill chars */ public int sc_width, sc_height; /* Height & width of screen */ public int ul_width, ue_width; /* Printing width of underline sequences */ --- 42,48 ----- public int auto_wrap; /* Terminal does \r\n when write past margin */ public int ignaw; /* Terminal ignores \n immediately after wrap */ + public int noaddline = 0; /* Terminal doesn't reverse scroll */ public int erase_char, kill_char; /* The user's erase and line-kill chars */ public int sc_width, sc_height; /* Height & width of screen */ public int ul_width, ue_width; /* Printing width of underline sequences */ *************** *** 323,328 { cannot("scroll backwards"); sc_addline = ""; } if (dumb || tgetflag("bs")) --- 325,331 ----- { cannot("scroll backwards"); sc_addline = ""; + noaddline = 1; } if (dumb || tgetflag("bs")) *** /tmp/,RCSt1011289 Wed Sep 18 15:41:31 1985 --- version.c Wed Sep 18 14:59:07 1985 *************** *** 69,74 * v38: Changed prompting; created prompt.c. 8/19/85 mark * v39: (Not -p) does not initially clear screen. 8/24/85 mark * v40: Added "skipping" indicator in forw(). 8/26/85 mark * ----------------------------------------------------------------- */ --- 69,76 ----- * v38: Changed prompting; created prompt.c. 8/19/85 mark * v39: (Not -p) does not initially clear screen. 8/24/85 mark * v40: Added "skipping" indicator in forw(). 8/26/85 mark + * v40a: Added repaint to reverse scrolling for 'dumb' 9/12/85 jcb + * v40b: Replaced system() with fork() and execl() for editor 9/18/85 jcb * ----------------------------------------------------------------- */ *************** *** 72,75 * ----------------------------------------------------------------- */ ! char version[] = "@(#) less version 40"; --- 74,77 ----- * ----------------------------------------------------------------- */ ! char version[] = "@(#) less version 40b"; -- Jim Budler Advanced Micro Devices, Inc. (408) 749-5806 UUCPnet: {ucbvax,decwrl,ihnp4,allegra,intelca}!amdcad!jimb Compuserve: 72415,1200 "... Don't sue me, I'm just the piano player!...." Brought to you by Super Global Mega Corp .com