194 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* Copyright (c) 1985 Ceriel J.H. Jacobs */
 | 
						|
 | 
						|
# ifndef lint
 | 
						|
static char rcsid[] = "$Header$";
 | 
						|
# endif
 | 
						|
 | 
						|
# define _PROMPT_
 | 
						|
 | 
						|
# include "in_all.h"
 | 
						|
# include "prompt.h"
 | 
						|
# include "term.h"
 | 
						|
# include "output.h"
 | 
						|
# include "options.h"
 | 
						|
# include "display.h"
 | 
						|
# include "process.h"
 | 
						|
# include "getline.h"
 | 
						|
# include "main.h"
 | 
						|
# include "getcomm.h"
 | 
						|
# include "keys.h"
 | 
						|
# include "assert.h"
 | 
						|
# include "commands.h"
 | 
						|
 | 
						|
#define basename(x) x
 | 
						|
 | 
						|
#ifndef basename
 | 
						|
STATIC char *	basename();
 | 
						|
#endif
 | 
						|
 | 
						|
static char *errorgiven;	/* Set to error message, if there is one */
 | 
						|
 | 
						|
char *
 | 
						|
copy(p, ep, s)
 | 
						|
	register char *p, *s;
 | 
						|
	char *ep;
 | 
						|
{
 | 
						|
	while (p < ep && *s) {
 | 
						|
		*p++ = *s++;
 | 
						|
	}
 | 
						|
	return p;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * display the prompt and refresh the screen.
 | 
						|
 */
 | 
						|
 | 
						|
VOID
 | 
						|
give_prompt() {
 | 
						|
 | 
						|
	register char **name;
 | 
						|
	register struct scr_info *p = &scr_info;
 | 
						|
	char buf[256];
 | 
						|
	register char *pb = buf;
 | 
						|
 | 
						|
	if (startcomm) return;
 | 
						|
	flush();
 | 
						|
	if (window()) {
 | 
						|
		redraw(0);
 | 
						|
		flush();
 | 
						|
	}
 | 
						|
	if (!stupid) {
 | 
						|
		/*
 | 
						|
		 * fancy prompt
 | 
						|
		 */
 | 
						|
		clrbline();
 | 
						|
		standout();
 | 
						|
		pb = copy(pb, &buf[255], basename(currentfile));
 | 
						|
		if (stdf >= 0) {
 | 
						|
			pb = copy(pb, &buf[255], ", ");
 | 
						|
			pb = copy(pb, &buf[255], getnum(p->firstline));
 | 
						|
			pb = copy(pb, &buf[255], "-");
 | 
						|
			pb = copy(pb, &buf[255], getnum(p->lastline));
 | 
						|
		}
 | 
						|
	}
 | 
						|
	else {
 | 
						|
		*pb++ = '\007';	/* Stupid terminal, stupid prompt */
 | 
						|
	}
 | 
						|
	if (errorgiven) {
 | 
						|
		/*
 | 
						|
		 * display error message
 | 
						|
		 */
 | 
						|
		pb = copy(pb, &buf[255], " ");
 | 
						|
		pb = copy(pb, &buf[255], errorgiven);
 | 
						|
		if (stupid) {
 | 
						|
			pb = copy(pb, &buf[255], "\r\n");
 | 
						|
		}
 | 
						|
		errorgiven = 0;
 | 
						|
	}
 | 
						|
	else if (!stupid && (status || maxpos)) {
 | 
						|
		pb = copy(pb, &buf[255], " (");
 | 
						|
		name = &filenames[filecount];
 | 
						|
		if (status) {
 | 
						|
			/*
 | 
						|
			 * indicate top and/or bottom
 | 
						|
			 */
 | 
						|
			if (status & START) {
 | 
						|
				if (!*(name - 1)) {
 | 
						|
					pb = copy(pb, &buf[255], "Top");
 | 
						|
				}
 | 
						|
				else {
 | 
						|
					pb = copy(pb, &buf[255], "Previous: ");
 | 
						|
					pb = copy(pb, &buf[255], basename(*(name - 1)));
 | 
						|
				}
 | 
						|
				if (status & EOFILE) {
 | 
						|
					pb = copy(pb, &buf[255], ", ");
 | 
						|
				}
 | 
						|
			}
 | 
						|
			if (status & EOFILE) {
 | 
						|
				if (!*(name+1)) {
 | 
						|
					pb = copy(pb, &buf[255], "Bottom");
 | 
						|
				}
 | 
						|
				else {
 | 
						|
					pb = copy(pb, &buf[255], "Next: ");
 | 
						|
					pb = copy(pb, &buf[255], basename(*(name + 1)));
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
		else {	/* display percentage */
 | 
						|
			pb = copy(pb, &buf[255], getnum((100 * getpos(p->lastline))/maxpos));
 | 
						|
			pb = copy(pb, &buf[255], "%");
 | 
						|
		}
 | 
						|
		pb = copy(pb, &buf[255], ")");
 | 
						|
	}
 | 
						|
	*pb = '\0';
 | 
						|
	if (!stupid) {
 | 
						|
		buf[COLS-1] = 0;
 | 
						|
		putline(buf);
 | 
						|
		standend();
 | 
						|
	}
 | 
						|
	else	putline(buf);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Remember error message
 | 
						|
 */
 | 
						|
 | 
						|
VOID
 | 
						|
error(str) char *str; {
 | 
						|
 | 
						|
	errorgiven = str;
 | 
						|
}
 | 
						|
 | 
						|
#ifndef basename
 | 
						|
STATIC char *
 | 
						|
basename(fn) char *fn; {	/* Return name without path */
 | 
						|
 | 
						|
	register char *s;
 | 
						|
 | 
						|
	s = fn;
 | 
						|
	while (*s++) ;		/* Search end of name */
 | 
						|
	for (;;) {
 | 
						|
		if (*--s == '/') {
 | 
						|
			/*
 | 
						|
			 * Backwards to first '/'
 | 
						|
			 */
 | 
						|
			if (*(s+1)) {
 | 
						|
				/*
 | 
						|
				 * There is a name after the '/'
 | 
						|
				 */
 | 
						|
				return s + 1;
 | 
						|
			}
 | 
						|
			*s = 0; /* No name after the '/' */
 | 
						|
		}
 | 
						|
		if (s == fn) return s;
 | 
						|
	}
 | 
						|
	/* NOTREACHED */
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
VOID
 | 
						|
ret_to_continue() {		/* Obvious */
 | 
						|
	int c;
 | 
						|
	static char buf[2];
 | 
						|
 | 
						|
	for (;;) {
 | 
						|
		clrbline();
 | 
						|
		standout();
 | 
						|
		if (errorgiven) {
 | 
						|
			putline(errorgiven);
 | 
						|
			putline(" ");
 | 
						|
			errorgiven = 0;
 | 
						|
		}
 | 
						|
		putline("[Type anything to continue]");
 | 
						|
		standend();
 | 
						|
		if (is_escape(c = getch())) {
 | 
						|
			buf[0] = c;
 | 
						|
			(VOID) match(buf, &c, currmap->k_mach);
 | 
						|
			assert(c > 0);
 | 
						|
			do_comm(c, -1L);
 | 
						|
		}
 | 
						|
		else	break;
 | 
						|
	}
 | 
						|
	clrbline();
 | 
						|
}
 |