diff miscellany/less-177/main.c @ 0:bce86c4163a3

Initial revision
author kono
date Mon, 18 Apr 2005 23:46:02 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/miscellany/less-177/main.c	Mon Apr 18 23:46:02 2005 +0900
@@ -0,0 +1,275 @@
+/*
+ * Entry point, initialization, miscellaneous routines.
+ */
+
+#include "less.h"
+#include "position.h"
+
+public int	ispipe;
+public char *	every_first_cmd = NULL;
+public int	new_file;
+public int	is_tty;
+public IFILE	curr_ifile = NULL_IFILE;
+public IFILE	old_ifile = NULL_IFILE;
+public struct scrpos initial_scrpos;
+public int	any_display = 0;
+public int	scroll;
+public char *	progname;
+public int	quitting;
+
+extern int	file;
+extern int	quit_at_eof;
+extern int	cbufs;
+extern int	errmsgs;
+extern int	screen_trashed;
+extern int	force_open;
+
+#if LOGFILE
+public int	logfile = -1;
+public int	force_logfile = 0;
+public char *	namelogfile = NULL;
+#endif
+
+#if EDITOR
+public char *	editor;
+public char *	editproto;
+#endif
+
+#if TAGS
+extern char *	tagfile;
+extern char *	tagpattern;
+extern int	tagoption;
+#endif
+
+
+
+/*
+ * Entry point.
+ */
+main(argc, argv)
+	int argc;
+	char *argv[];
+{
+	IFILE h;
+	int nofiles;
+	extern char *getenv();
+
+	progname = *argv++;
+
+	/*
+	 * Process command line arguments and LESS environment arguments.
+	 * Command line arguments override environment arguments.
+	 */
+	init_prompt();
+	init_charset();
+	init_option();
+	scan_option(getenv("LESS"));
+
+#define	isoptstring(s)	(((s)[0] == '-' || (s)[0] == '+') && (s)[1] != '\0')
+	while (--argc > 0 && (isoptstring(argv[0]) || isoptpending()))
+		scan_option(*argv++);
+#undef isoptstring
+
+	if (isoptpending())
+	{
+		/*
+		 * Last command line option was a flag requiring a
+		 * following string, but there was no following string.
+		 */
+		nopendopt();
+		quit(0);
+	}
+
+#if USERFILE
+	/*
+	 * Try to use the lesskey file "$HOME/.less".
+	 */
+	add_hometable();
+#endif
+#if EDITOR
+	editor = getenv("EDITOR");
+	if (editor == NULL || *editor == '\0')
+		editor = EDIT_PGM;
+	editproto = getenv("LESSEDIT");
+	if (editproto == NULL || *editproto == '\0')
+		editproto = "%E ?lm+%lm. %f";
+#endif
+
+	/*
+	 * Set up terminal, etc.
+	 */
+	is_tty = isatty(1);
+	if (!is_tty)
+	{
+		/*
+		 * Output is not a tty.
+		 * Just copy the input file(s) to output.
+		 */
+		if (argc <= 0)
+		{
+			if (edit("-", 0) == 0)
+				cat_file();
+		} else
+		{
+			while (--argc >= 0)
+			{
+				if (edit(*argv++, 0) == 0)
+					cat_file();
+			}
+		}
+		quit(0);
+	}
+
+	/*
+	 * Call get_ifile with all the command line filenames
+	 * to "register" them with the ifile system.
+	 */
+	h = NULL_IFILE;
+	while (--argc >= 0)
+		h = get_ifile(*argv++, h);
+
+	init_mark();
+	raw_mode(1);
+	get_term();
+	open_getchr();
+
+	init_signals(1);
+
+	/*
+	 * Select the first file to examine.
+	 */
+#if TAGS
+	if (tagoption)
+	{
+		/*
+		 * A -t option was given.
+		 * Verify that no filenames were also given.
+		 * Edit the file selected by the "tags" search,
+		 * and search for the proper line in the file.
+		 */
+		if (nifile() > 0)
+		{
+			error("No filenames allowed with -t option", NULL_PARG);
+			quit(1);
+		}
+		if (tagfile == NULL)
+			quit(1);
+		if (edit(tagfile, 0) || tagsearch())
+			quit(1);
+		nofiles = 0;
+	} else
+#endif
+	if (nifile() == 0)
+		nofiles = edit("-", 0);	/* Standard input */
+	else 
+		nofiles = edit_first();
+
+	if (nofiles)
+	{
+		quit(1);
+		/*NOTREACHED*/
+	}
+
+	init();
+	commands();
+	quit(0);
+	/*NOTREACHED*/
+}
+
+/*
+ * Copy a string, truncating to the specified length if necessary.
+ * Unlike strncpy(), the resulting string is guaranteed to be null-terminated.
+ */
+	public void
+strtcpy(to, from, len)
+	char *to;
+	char *from;
+	unsigned int len;
+{
+	strncpy(to, from, len);
+	to[len-1] = '\0';
+}
+
+/*
+ * Copy a string to a "safe" place
+ * (that is, to a buffer allocated by calloc).
+ */
+	public char *
+save(s)
+	char *s;
+{
+	register char *p;
+
+	p = (char *) ecalloc(strlen(s)+1, sizeof(char));
+	strcpy(p, s);
+	return (p);
+}
+
+	public VOID_POINTER
+ecalloc(count, size)
+	int count;
+	unsigned int size;
+{
+	register VOID_POINTER p;
+
+	p = calloc(count, size);
+	if (p != NULL)
+		return (p);
+	error("Cannot allocate memory", NULL_PARG);
+	quit(1);
+	/*NOTREACHED*/
+}
+
+/*
+ * Skip leading spaces in a string.
+ */
+	public char *
+skipsp(s)
+	register char *s;
+{
+	while (*s == ' ' || *s == '\t')	
+		s++;
+	return (s);
+}
+
+/*
+ * Exit the program.
+ */
+	public void
+quit(status)
+	int status;
+{
+	static int save_status;
+
+	/*
+	 * Put cursor at bottom left corner, clear the line,
+	 * reset the terminal modes, and exit.
+	 */
+	if (status < 0)
+		status = save_status;
+	else
+		save_status = status;
+	quitting = 1;
+#if LOGFILE
+	end_logfile();
+#endif
+	if (any_display)
+	{
+		lower_left();
+		clear_eol();
+	}
+	deinit();
+	flush();
+	raw_mode(0);
+#if __MSDOS__
+	restore_screen();
+	/* 
+	 * If we don't close 2, we get some garbage from
+	 * 2's buffer when it flushes automatically.
+	 * I cannot track this one down  RB
+	 * The same bug shows up if we use ^C^C to abort.
+	 */
+	close(2);
+#endif
+	exit(status);
+}