⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lsystem.c

📁 早期freebsd实现
💻 C
字号:
/* * Routines to execute other programs. * Necessarily very OS dependent. */#include <stdio.h>#include <signal.h>#include "less.h"#include "position.h"#if __MSDOS__#include <process.h>#include <dos.h>#include <fcntl.h>#include <io.h>#include <errno.h>#include <dir.h>#include <string.h>#include <stdlib.h>#include <time.h>#include <ctype.h>char get_swchar();void swchar_to_dos();void swchar_to_unix();#endifextern char *getenv();extern int screen_trashed;extern IFILE curr_ifile;/* * Pass the specified command to a shell to be executed. * Like plain "system()", but handles resetting terminal modes, etc. */	public voidlsystem(cmd)	char *cmd;{	register int inp;	register char *shell;	register char *p;	register char *curr_filename;	/*	 * Print the command which is to be executed,	 * unless the command starts with a "-".	 */	if (cmd[0] == '-')		cmd++;	else	{		lower_left();		clear_eol();		putstr("!");		putstr(cmd);		putstr("\n");	}	/*	 * Close the current input file.	 */	curr_filename = get_filename(curr_ifile);	(void) edit(NULL, 0);	/*	 * De-initialize the terminal and take out of raw mode.	 */	deinit();	flush();	/* Make sure the deinit chars get out */	raw_mode(0);	/*	 * Restore signals to their defaults.	 */	init_signals(0);	/*	 * Force standard input to be the user's terminal	 * (the normal standard input), even if less's standard input 	 * is coming from a pipe.	 */#if __MSDOS__{	register int inp2;	inp = dup(0);	inp2 = open("CON", O_TEXT|O_RDONLY);	dup2(0,inp2);}#else	inp = dup(0);	close(0);	if (open("/dev/tty", 0) < 0)		dup(inp);#endif	/*	 * Pass the command to the system to be executed.	 * If we have a SHELL environment variable, use	 * <$SHELL -c "command"> instead of just <command>.	 * If the command is empty, just invoke a shell.	 */#if __MSDOS__{	int result;	char sw_char;	sw_char = get_swchar();	swchar_to_dos();	result = system(cmd);	if (result != 0)		perror("less");	if (sw_char == '-')		swchar_to_unix();}#else	p = NULL;	if ((shell = getenv("SHELL")) != NULL && *shell != '\0')	{		if (*cmd == '\0')			p = save(shell);		else		{			p = (char *) ecalloc(strlen(shell) + strlen(cmd) + 7, 					sizeof(char));			sprintf(p, "%s -c \"%s\"", shell, cmd);		}	}	if (p == NULL)	{		if (*cmd == '\0')			p = save("sh");		else			p = save(cmd);	}	system(p);	free(p);#endif	/*	 * Restore standard input, reset signals, raw mode, etc.	 */#if __MSDOS__	close(inp2);	dup2(0,inp);	close(inp);#else	close(0);	dup(inp);	close(inp);#endif	init_signals(1);	raw_mode(1);	init();	screen_trashed = 1;	/*	 * Reopen the current input file.	 */	(void) edit(curr_filename, 0);#if defined(SIGWINCH) || defined(SIGWIND)	/*	 * Since we were ignoring window change signals while we executed	 * the system command, we must assume the window changed.	 * Warning: this leaves a signal pending (in "sigs"),	 * so psignals() should be called soon after lsystem().	 */	winch();#endif}#if PIPEC/* * Pipe a section of the input file into the given shell command. * The section to be piped is the section "between" the current * position and the position marked by the given letter. * * The "current" position means the top line displayed if the mark * is after the current screen, or the bottom line displayed if * the mark is before the current screen. * If the mark is on the current screen, the whole screen is displayed. */	public intpipe_mark(c, cmd)	int c;	char *cmd;{	POSITION mpos, tpos, bpos;	/*	 * mpos = the marked position.	 * tpos = top of screen.	 * bpos = bottom of screen.	 */	mpos = markpos(c);	if (mpos == NULL_POSITION)		return (-1);	tpos = position(TOP);	if (tpos == NULL_POSITION)		tpos = ch_zero();	bpos = position(BOTTOM); 	if (c == '.')  		return (pipe_data(cmd, tpos, bpos)); 	else if (mpos <= tpos) 		return (pipe_data(cmd, mpos, tpos)); 	else if (bpos == NULL_POSITION) 		return (pipe_data(cmd, tpos, bpos)); 	else 		return (pipe_data(cmd, tpos, mpos));}/* * Create a pipe to the given shell command. * Feed it the file contents between the positions spos and epos. */	public intpipe_data(cmd, spos, epos)	char *cmd;	POSITION spos;	POSITION epos;{	register FILE *f;	register int c;	extern FILE *popen();	/*	 * This is structured much like lsystem().	 * Since we're running a shell program, we must be careful	 * to perform the necessary deinitialization before running	 * the command, and reinitialization after it.	 */	if (ch_seek(spos) != 0)	{		error("Cannot seek to start position", NULL_PARG);		return (-1);	}	if ((f = popen(cmd, "w")) == NULL)	{		error("Cannot create pipe", NULL_PARG);		return (-1);	}	lower_left();	clear_eol();	putstr("!");	putstr(cmd);	putstr("\n");	deinit();	flush();	raw_mode(0);	init_signals(0);#ifdef SIGPIPE	SIGNAL(SIGPIPE, SIG_IGN);#endif	while (epos == NULL_POSITION || spos++ <= epos)	{		/*		 * Read a character from the file and give it to the pipe.		 */		c = ch_forw_get();		if (c == EOI)			break;		if (putc(c, f) == EOF)			break;	}	/*	 * Finish up the last line.	 */ 	while (c != '\n' && c != EOI )  	{ 		c = ch_forw_get(); 		if (c == EOI) 			break; 		if (putc(c, f) == EOF) 			break; 	}	pclose(f);#ifdef SIGPIPE	SIGNAL(SIGPIPE, SIG_DFL);#endif	init_signals(1);	raw_mode(1);	init();	screen_trashed = 1;#if defined(SIGWINCH) || defined(SIGWIND)	/* {{ Probably don't need this here. }} */	winch();#endif	return (0);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -