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;
 | |
| }
 | 
