128 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* Copyright (c) 1985 Ceriel J.H. Jacobs */
 | 
						|
 | 
						|
# ifndef lint
 | 
						|
static char rcsid[] = "$Header$";
 | 
						|
# endif
 | 
						|
 | 
						|
# define _PROCESS_
 | 
						|
 | 
						|
# include "in_all.h"
 | 
						|
# if USG_OPEN
 | 
						|
# include <fcntl.h>
 | 
						|
# endif
 | 
						|
# if BSD4_2_OPEN
 | 
						|
# include <sys/file.h>
 | 
						|
# endif
 | 
						|
# if POSIX_OPEN
 | 
						|
# include <sys/types.h>
 | 
						|
# include <fcntl.h>
 | 
						|
# endif
 | 
						|
# include <sys/types.h>
 | 
						|
# include <sys/stat.h>
 | 
						|
# include "process.h"
 | 
						|
# include "commands.h"
 | 
						|
# include "display.h"
 | 
						|
# include "prompt.h"
 | 
						|
# include "getline.h"
 | 
						|
# include "main.h"
 | 
						|
# include "options.h"
 | 
						|
# include "output.h"
 | 
						|
 | 
						|
static int nfiles;		/* Number of filenames on command line */
 | 
						|
 | 
						|
/*
 | 
						|
 * Visit a file, file name is "fn".
 | 
						|
 */
 | 
						|
 | 
						|
VOID
 | 
						|
visitfile(fn) char *fn; {
 | 
						|
	struct stat statbuf;
 | 
						|
 | 
						|
	if (stdf > 0) {
 | 
						|
		/*
 | 
						|
		 * Close old input file
 | 
						|
		 */
 | 
						|
		(VOID) close(stdf);
 | 
						|
	}
 | 
						|
	currentfile = fn;
 | 
						|
# if USG_OPEN || BSD4_2_OPEN || POSIX_OPEN
 | 
						|
	if ((stdf = open(fn,O_RDONLY,0)) < 0) {
 | 
						|
# else
 | 
						|
	if ((stdf = open(fn,0)) < 0) {
 | 
						|
# endif
 | 
						|
		error(": could not open");
 | 
						|
		maxpos = 0;
 | 
						|
	}
 | 
						|
	else {	/* Get size for percentage in prompt */
 | 
						|
		(VOID) fstat(stdf, &statbuf);
 | 
						|
		maxpos = statbuf.st_size;
 | 
						|
	}
 | 
						|
	do_clean();
 | 
						|
	d_clean();
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * process the input files, one by one.
 | 
						|
 * If there is none, input is from a pipe.
 | 
						|
 */
 | 
						|
 | 
						|
VOID
 | 
						|
processfiles(n,argv) char ** argv; {
 | 
						|
 | 
						|
	static char *dummies[3];
 | 
						|
	long arg;
 | 
						|
 | 
						|
	if (!(nfiles = n)) {
 | 
						|
		/*
 | 
						|
		 * Input from pipe
 | 
						|
		 */
 | 
						|
		currentfile = "standard-input";
 | 
						|
		/*
 | 
						|
		 * Take care that *(filenames - 1) and *(filenames + 1) are 0
 | 
						|
		 */
 | 
						|
		filenames = &dummies[1];
 | 
						|
		d_clean();
 | 
						|
		do_clean();
 | 
						|
	}
 | 
						|
	else {
 | 
						|
		filenames = argv;
 | 
						|
		(VOID) nextfile(0);
 | 
						|
	}
 | 
						|
	*--argv = 0;
 | 
						|
	if (startcomm) {
 | 
						|
		n = getcomm(&arg);
 | 
						|
		if (commands[n].c_flags & NEEDS_SCREEN) {
 | 
						|
			redraw(0);
 | 
						|
		}
 | 
						|
		do_comm(n,arg);
 | 
						|
		startcomm = 0;
 | 
						|
	}
 | 
						|
	redraw(1);
 | 
						|
	if (setjmp(SetJmpBuf)) {
 | 
						|
		nflush();
 | 
						|
		redraw(1);
 | 
						|
	}
 | 
						|
	DoneSetJmp = 1;
 | 
						|
	for (;;) {
 | 
						|
		interrupt = 0;
 | 
						|
		n = getcomm(&arg);
 | 
						|
		do_comm(n, arg);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Get the next file the user asks for.
 | 
						|
 */
 | 
						|
 | 
						|
int
 | 
						|
nextfile(n) {
 | 
						|
	register i;
 | 
						|
 | 
						|
	if ((i = filecount + n) >= nfiles || i < 0) {
 | 
						|
		return 1;
 | 
						|
	}
 | 
						|
	filecount = i;
 | 
						|
	visitfile(filenames[i]);
 | 
						|
	return 0;
 | 
						|
}
 |