[alt.sources] ecu - SCO XENIX V/{2,3}86 Extended CU part 02/47

wht@tridom.uucp (Warren Tucker) (10/09/89)

---- Cut Here and unpack ----
#!/bin/sh
# this is part 2 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file ecu.c continued
#
CurArch=2
if test ! -r s2_seq_.tmp
then echo "Please unpack part 1 first!"
     exit 1; fi
( read Scheck
  if test "$Scheck" != $CurArch
  then echo "Please unpack part $Scheck next!"
       exit 1;
  else exit 0; fi
) < s2_seq_.tmp || exit 1
echo "x - Continuing file ecu.c"
sed 's/^X//' << 'SHAR_EOF' >> ecu.c
X		else
X		{
X			choose_line(Lbaud);
X			if(!Lline[0])
X			{
X				fprintf(se,"no line available at %u baud\r\n",Lbaud);
X				hangup(HANGUP_LINE_OPEN_ERROR);
X			}
X		}
X	}
X
X	cptr = (char *)0;
X	if(initial_procedure[0])
X	{
X		init_proc_argv[0] = initial_procedure;
X		init_proc_argc = 1;
X		for(iargv = 1; iargv < argc; iargv++)
X		{
X			if(*argv[iargv] != '-')
X			{
X				if(init_proc_argc == MAX_PARGV)
X				{
X					ff(se,"too many arguments to initial procedure\r\n");
X					hangup(1);
X				}
X				init_proc_argv[init_proc_argc++] = argv[iargv];
X			}
X		}
X
X/* wierd bug fixed by this ... I know not why */
X		windows_start();
X		windows_end2();
X		fflush(so);
X
X		ttymode(2);
X		if(do_proc(init_proc_argc,init_proc_argv))
X		{
X			if(quit_on_init_proc_fail)
X				hangup(HANGUP_INIT_PROC_ERROR);
X		}
X		proc_file_reset();
X		colors_save = current_colors;
X		setcolor(0x07000800L);	/* gray */
X		fputs("[procedure finished]",se);
X		setcolor(colors_save);
X		ff(se,"\r\n");
X		if(Liofd < 0)
X		{
X			ff(se,"\r\n");
X			ff(se,"\r\n");
X			stand_out();
X			ff(se, " [no line attached by initial procedure] ");
X			stand_end();
X			ff(se,"\r\n");
X			if(quit_on_init_proc_fail)
X				hangup(HANGUP_INIT_PROC_ERROR);
X			stand_out();
X			ff(se, " [press ESC to exit or SPACE for setup menu ] ");
X			stand_end();
X			itmp = ttygetc(0);
X			ff(se,"\r\n");
X			if(itmp == ESC)
X				hangup(1);
X			ttymode(1);	
X			setup_screen((char *)0);
X		}
X		else
X		{
X
X			ttymode(1);
X			start_rcvr_process(0);
X		}
X	}
X	else		/* no initial procedure */
X	{
X		cptr = (char *)0;
X		for(iargv = 1; iargv < argc; iargv++)
X		{
X			if((*argv[iargv] != '-') || (strcmp(argv[iargv],"-") == 0))
X			{
X				cptr = argv[iargv];
X				break;
X			}
X		}
X		ttymode(1);	
X		setup_screen(cptr);
X	}
X
X	hangup(xmtr());			/* enter xmtr operation */
X	/*NOTREACHED*/
X}	/* end of main */
X
X/* end of ecu.c */
X
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
echo "File ecu.c is complete"
chmod 0644 ecu.c || echo "restore of ecu.c fails"
echo "x - extracting ecuLCK.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ecuLCK.c &&
X/* CHK=0xC002 */
X/*+-----------------------------------------------------------------------
X	ecuLCK.c -- lock file management
X	Copyright 1986,1989 Warren H. Tucker, III. All Rights Reserved
X
X  Defined functions:
X	check_utmp()
X	create_lock_file(lock_file_name)
X	lock_tty()
X	make_lock_name(ttyname,lock_file_name)
X	other_lock_name(first_lock_name)
X	unlock_tty()
X
X------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */
X/*:06-30-1989-01:06-wht-ecuungetty interface SEEMS to be working now */
X/*:06-29-1989-00:42-wht-add ungetty handler */
X/*:06-24-1989-16:52-wht-flush edits --- ecu 1.95 */
X
X#include "ecu.h"
X#include "utmpstatus.h"
X
Xextern int errno;
Xextern char ungetty_ttyname[];
X
X/*+-------------------------------------------------------------------------
X	check_utmp()
Xreturn 0 if line available, else LOPEN code
X--------------------------------------------------------------------------*/
Xint
Xcheck_utmp()
X{
Xregister ufd;
Xregister status = 0;
X
X	switch(utmp_status(Lline))
X	{
X		case US_DIALOUT:	/* enabled for login, currently dialout */
X			status = LOPEN_DIALOUT_IN_USE;
X			break;
X		case US_LOGGEDIN:	/* enabled for login, in use */
X			status = LOPEN_ENABLED_IN_USE;
X			break;
X		case US_NOTFOUND:	/* not in utmp, or getty dead */
X			break;
X		case US_LOGIN:		/* enabled for login, idle */
X			status = ungetty_get_line();
X			break;
X	}
X	return(status);
X
X}	/* end of check_utmp */
X
X/*+-------------------------------------------------------------------------
X	make_lock_name(ttyname,lock_file_name)
X--------------------------------------------------------------------------*/
Xmake_lock_name(ttyname,lock_file_name)
Xchar *ttyname;
Xchar *lock_file_name;
X{
X
X	if((ulindex(ttyname,"/dev/tty")) != 0)
X		return(LOPEN_INVALID);
X
X	strcpy(lock_file_name,"/usr/spool/uucp/LCK..");
X	strcat(lock_file_name,ttyname + 5);
X	return(0);
X
X}	/* end of make_lock_name */
X
X/*+-----------------------------------------------------------------------
X	line_locked(ttyname)
X
X  Returns 1 if locked else 0
X------------------------------------------------------------------------*/
Xint
Xline_locked(ttyname)
Xchar *ttyname;
X{
Xint fd_lockf;
Xint status = 0;
Xint pid;
Xchar pidstr[20];
Xchar lock_file_name[64];
X	
X	make_lock_name(ttyname,lock_file_name);
X
X	if((fd_lockf = open(lock_file_name,O_RDONLY,0)) >= 0)
X	{
X		if((read(fd_lockf,pidstr,11) == 11) &&
X			(sscanf(pidstr,"%10d",&pid) == 1))
X		{
X			status = 1;
X			if(kill(pid,0)) 				/* is owner pid already dead? */
X			{
X				if(errno == ESRCH)			/* this error sez so */
X					status = 0;
X			} 
X			/* owner pid still active with lock */
X		}
X	} 
X	close(fd_lockf);
X	return(status);
X}	/* end of line_locked */
X
X/*+-----------------------------------------------------------------------
X	create_lock_file()
X
X  Returns 0 if lock file created,else error codes:
X	LOPEN_ if error
X    else pid of process currently busy on device
X------------------------------------------------------------------------*/
Xint
Xcreate_lock_file(lock_file_name)
Xchar *lock_file_name;
X{
Xregister itmp;
Xregister fd_lockf;
Xint pid;
Xchar pidstr[20];
Xint old_umask;
Xint erc = 0;
X
X	old_umask = umask(0);
X
X	if((fd_lockf = open(lock_file_name,O_CREAT | O_EXCL | O_RDWR,0666)) < 0)
X	{		/* file already exists */
X		if((fd_lockf = open(lock_file_name,O_RDWR,0666)) < 0)
X		{
X			erc = LOPEN_LCKERR;
X			goto RESTORE_UMASK;
X		}
X		else if(((itmp = read(fd_lockf,pidstr,11)) == 11) &&
X			(sscanf(pidstr,"%10d",&pid) == 1))
X		{
X			if(kill(pid,0)) 				/* is owner pid already dead? */
X			{
X				if(errno == ESRCH)			/* this error sez so */
X				{
X					pid = getpid();			/* so we will use it */
X					lseek(fd_lockf,0L,0);
X					sprintf(pidstr,"%10d\n",pid);
X					write(fd_lockf,pidstr,11);
X					close(fd_lockf);
X					erc = 0;
X					goto RESTORE_UMASK;
X				}
X			} 
X			/* owner pid still active with lock */
X			close(fd_lockf);
X			erc = pid;			/* port is busy */
X			goto RESTORE_UMASK;
X		}
X		else
X		{
X			close(fd_lockf);
X			erc = LOPEN_UNKPID;
X			goto RESTORE_UMASK;
X		}
X	} 
X	pid = getpid();
X	sprintf(pidstr,"%10d\n",pid);
X	write(fd_lockf,pidstr,11);
X
X#if defined(M_XENIX)
X	close(fd_lockf);
X	chmod(lock_file_name,0666);
X#else
X	fchmod(fd_lockf,0666);
X	close(fd_lockf);
X#endif
X
XRESTORE_UMASK:
X	(void)umask(old_umask);
X	return(erc);
X
X}	/* end of create_lock_file */
X
X/*+-------------------------------------------------------------------------
X	other_lock_name(first_lock_name)
X--------------------------------------------------------------------------*/
Xchar *
Xother_lock_name(first_lock_name)
Xchar *first_lock_name;
X{
Xregister itmp;
Xstatic char other_lock_name[64];
X
X	strcpy(other_lock_name,first_lock_name);
X	itmp = strlen(other_lock_name) - 1;
X	if(islower(other_lock_name[itmp]))
X		other_lock_name[itmp] = toupper(other_lock_name[itmp]);
X	else if(isupper(other_lock_name[itmp]))
X		other_lock_name[itmp] = tolower(other_lock_name[itmp]);
X
X	return(other_lock_name);
X		
X}	/* end of other_lock_name */
X
X/*+-------------------------------------------------------------------------
X	lock_tty()
X--------------------------------------------------------------------------*/
Xlock_tty()
X{
Xregister itmp;
X
X	if(itmp = make_lock_name(Lline,LLCKname))
X		return(itmp);
X
X	if(itmp = check_utmp())
X		return(itmp);
X
X	if(!ungetty_ttyname[0])
X	{
X		if(itmp = create_lock_file(LLCKname))
X		{
X			ungetty_return_line();
X			return(itmp);
X		}
X	}
X
X	if(itmp = create_lock_file(other_lock_name(LLCKname)))
X	{
X		if(ungetty_ttyname[0])
X			ungetty_return_line();
X		else
X			unlink(other_lock_name(LLCKname));
X		unlink(LLCKname);
X		LLCKname[0] = 0;
X		return(itmp);
X	}
X
X	return(0);
X
X}	/* end of lock_tty */
X
X/*+-----------------------------------------------------------------------
X	void unlock_tty()
X------------------------------------------------------------------------*/
Xvoid
Xunlock_tty()
X{
X
X	ungetty_return_line();
X
X	if(LLCKname[0] == 0)
X		return;
X
X	unlink(LLCKname);
X	unlink(other_lock_name(LLCKname));
X
X	LLCKname[0] = 0;
X
X}	/* end of unlock_tty */
X
X/* end of ecuLCK.c */
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
chmod 0644 ecuLCK.c || echo "restore of ecuLCK.c fails"
echo "x - extracting ecuchdir.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ecuchdir.c &&
X/* CHK=0x2265 */
X/*+-------------------------------------------------------------------------
X	ecuchdir.c
X	Copyright 1986,1989 Warren H. Tucker, III. All Rights Reserved
X
X  Defined functions:
X	cd_array_delete(arg,narg)
X	cd_array_delete_usage()
X	cd_array_init()
X	cd_array_read(arg,narg)
X	cd_array_save(arg,narg)
X	change_directory(cdarg,arg_present_flag)
X	expand_dirname(dirname)
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */
X/*:06-24-1989-16:52-wht-flush edits --- ecu 1.95 */
X
X#include "ecu.h"
X#include "ecukey.h"
X#include <pwd.h>
X
X#define CD_QUAN		44
X#define CD_PATHLEN	130
Xchar *cd_array[CD_QUAN];
Xuint cd_in_use = 0;
X
Xextern char curr_dir[];		/* current working directory */
Xextern int errno;
X
X/*+-------------------------------------------------------------------------
X	cd_array_read(arg,narg)
X--------------------------------------------------------------------------*/
Xvoid
Xcd_array_read(arg,narg)
Xchar **arg;
Xint narg;
X{
Xchar dirpath[CD_PATHLEN];
XFILE *fpcd;
XFILE *fopen();
Xregister char *cptr;
Xregister itmp;
Xchar *skip_ld_break();
X
X	get_home_dir(dirpath);
X	strcat(dirpath,"/.ecu/dir");
X	if((fpcd = fopen(dirpath,"r")) == (FILE *)0)
X		return;		/* none found */
X
X	for(cd_in_use = 0; cd_in_use < CD_QUAN; cd_in_use++)
X	{
X		if(fgets(dirpath,sizeof(dirpath),fpcd) == (char *)0)
X			break;
X		dirpath[strlen(dirpath) - 1] = 0;
X		cptr = skip_ld_break(dirpath);
X		if(strlen(cptr) == 0)
X		{
X			--cd_in_use;
X			continue;
X		}
X		strcpy(cd_array[cd_in_use],cptr);
X	}
X	fclose(fpcd);
X}	/* end of cd_array_read */
X
X/*+-------------------------------------------------------------------------
X	cd_array_save(arg,narg)
X--------------------------------------------------------------------------*/
Xvoid cd_array_save(arg,narg)
Xchar **arg;
Xint narg;
X{
Xregister icd;
Xchar savepath[256];
XFILE *fpcd;
XFILE *fopen();
X
X	get_home_dir(savepath);
X	strcat(savepath,"/.ecu/dir");
X
X	if(cd_in_use == 0)
X	{
X		ff(se,"No directory list to save in %s\r\n",savepath);
X		return;
X	}
X	if((fpcd = fopen(savepath,"w")) == (FILE *)0)
X	{
X		ff(se,"%s could not be opened\r\n",savepath);
X		return;
X	}
X
X	for(icd = 0; icd < cd_in_use; icd++)
X		fprintf(fpcd,"%s\n",cd_array[icd]);
X	fclose(fpcd);
X	ff(se,"%d entries saved in %s\r\n",cd_in_use,savepath);
X
X}	/* end of cd_array_save */
X
X/*+-------------------------------------------------------------------------
X	cd_array_delete_usage()
X--------------------------------------------------------------------------*/
Xvoid
Xcd_array_delete_usage()
X{
X	ff(se,"usage del[ete] <1st> [<last>]\r\n");
X}	/* end of cd_array_delete_usage */
X
X/*+-------------------------------------------------------------------------
X	cd_array_delete(arg,narg)
X--------------------------------------------------------------------------*/
Xcd_array_delete(arg,narg)
Xchar **arg;
Xint narg;
X{
Xuint first;		/* 1st to delete */
Xuint last;		/* last to delete */
X
X	if((narg < 2) || (narg > 3))
X	{
X		cd_array_delete_usage();
X		return(-1);
X	}
X
X	first = atoi(arg[1]) - 1;
X	if(narg == 2)
X		last = first;
X	else
X		last = atoi(arg[2]) - 1;
X
X	if((first > (cd_in_use - 1)) || (last > (cd_in_use - 1)) || (last < first))
X	{
X		cd_array_delete_usage();
X		return(-1);
X	}
X
X	if(last == (cd_in_use - 1))
X	{
X		cd_in_use = first;
X	}
X	else
X	{
X	int count_less = last - first + 1;
X		last++;
X		while(last != cd_in_use)
X			strcpy(cd_array[first++],cd_array[last++]);
X		cd_in_use -= count_less;
X	}
X	return(0);
X}	/* end of cd_array_delete */
X
X/*+-------------------------------------------------------------------------
X	cd_array_init()
X--------------------------------------------------------------------------*/
Xcd_array_init()
X{
Xregister itmp;
Xchar *malloc();
X
X/*allocate change_ irectory stack */
X	for(itmp = 0; itmp < CD_QUAN; itmp++)
X	{
X		if((cd_array[itmp] = malloc(CD_PATHLEN + 1)) == (char *)0)
X		{
X			ff(se,"Not enough memory for cd stack\r\n");
X			exit(1);
X		}
X		*cd_array[itmp] = 0;
X	}
X	(void)cd_array_read(cd_array,0);
X}	/* end of cd_array_init */
X
X/*+-------------------------------------------------------------------------
X	expand_dirname(dirname) - convert dirnames with shell chars
X--------------------------------------------------------------------------*/
Xexpand_dirname(dirname,maxlen)
Xchar *dirname;
Xint maxlen;
X{
Xregister itmp;
Xregister char *cptr;
Xchar s256[256];
Xchar *expcmd;
X
X	if(!find_shell_chars(dirname))
X		return(0);
X
X	sprintf(s256,"`ls -d %s`",dirname);
X	if(expand_cmd_with_wildlist(s256,&expcmd))
X	{
X		ff(se,"No files match\r\n");
X		return;
X	}
X	strncpy(dirname,expcmd,maxlen);
X	dirname[maxlen - 1] = 0;
X	free(expcmd);
X	if(strchr(dirname,' '))
X	{
X		fputs("Too many files:\r\n",se);
X		fputs(dirname,se);
X		fputs("\r\n",se);
X		return(-1);
X	}
X	return(0);
X
X}	/* end of expand_dirname */
X
X/*+-------------------------------------------------------------------------
X	change_directory(dirname,arg_present_flag)
X
X  Change directory to 'dirname' if arg_present_flag is true,
X  else if flag 0, ask for new directory name and change to it
X  This procedure maintains the global variable 'curr_dir' that
X  reflects the ecu transmitter and receiver process current
X  working directory.
X--------------------------------------------------------------------------*/
Xchange_directory(cdarg,arg_present_flag)
Xchar *cdarg;
Xint arg_present_flag;
X{
Xregister icd;
Xregister itmp;
Xchar s130[130];
X#define ARG_MAX	5
Xchar *arg[ARG_MAX];
Xint narg;
Xint longest;
X
X	if(cd_in_use == 0)
X		cd_array_read(arg,0);
X
X	fputs("  ",se);
X
X	if(arg_present_flag)		/* if there is an argument ... */
X	{
X		if(isdigit(*cdarg))		/* ... and first char is digit */
X		{
X			icd = atoi(cdarg) - 1;
X			if(icd >= cd_in_use)
X				goto DISPLAY_CD_ARRAY;
X			strncpy(s130,cd_array[icd],sizeof(s130) - 1);
X		}
X		else
X			strncpy(s130,cdarg,sizeof(s130) - 1);	/* literal dir spec */
X
X		s130[sizeof(s130) - 1] = 0;
X	}
X	else		/* no arg to cd command */
X	{
XDISPLAY_CD_ARRAY:
X		fputs("\r\n",se);
X		longest = 0;
X		for(icd = 0; icd < CD_QUAN/2; icd++)
X		{
X			if(icd >= cd_in_use)
X				break;
X			if(longest < (itmp = strlen(cd_array[icd])))
X				longest = itmp;
X		}
X		longest += 4;
X		if(longest < 36)
X			longest += 4;
X		for(icd = 0; icd < CD_QUAN/2; icd++)
X		{
X			if(icd >= cd_in_use)
X				break;
X			sprintf(s130,"%2d %s ",icd + 1,cd_array[icd]);
X			fputs(s130,se);
X			if(icd + CD_QUAN/2 >= cd_in_use)
X				fputs("\r\n",se);
X			else
X			{
X				itmp = longest - strlen(s130);
X				while(itmp-- > 0)
X					fputc(' ',se);
X				sprintf(s130,"%2d %s\r\n",
X					icd + 1 + CD_QUAN/2,cd_array[icd + CD_QUAN/2]);
X				fputs(s130,se);
X			
X			}
X		}
X		fputs("current dir: ",se);
X		stand_out();
X		ff(se," %s ",curr_dir);
X		stand_end();
X		eeol();
X		fputs("\r\n",se);
X
XGET_NEW_DIR:
X		fputs("New dir, <#>, %save, %read, %del, %xmitcd, <enter>:  ",se);
X		ttygets(s130,sizeof(s130),1);
X		if( (s130[0] == ESC) || (strlen(s130) == 0) )
X		{
X			ff(se,"no directory change\r\n");
X			return(0);
X		}
X		else if(s130[0] == '%')
X		{
X			build_str_array(s130,arg,ARG_MAX,&narg);
X
X			if(minunique("save",&s130[1],1))
X			{
X				cd_array_save(arg,narg);
X				goto GET_NEW_DIR;
X			}
X			else if(minunique("read",&s130[1],1))
X			{
X				cd_array_read(arg,narg);
X				goto DISPLAY_CD_ARRAY;
X			}
X			else if(minunique("delete",&s130[1],1))
X			{
X				if(cd_array_delete(arg,narg))
X					goto GET_NEW_DIR;
X				else
X					goto DISPLAY_CD_ARRAY;
X			}
X			else if(minunique("xmitcd",&s130[1],1))
X			{
X				lputs("cd ");
X				lputs(curr_dir);
X				lputc('\r');
X				return(0);
X			}
X			else
X			{
X				ff(se,"Invalid cd subcommand\r\n");
X				goto GET_NEW_DIR;
X			}
X		}
X		else if(icd = atoi(s130))
X		{
X			icd--;
X			if(icd >= cd_in_use)
X				goto GET_NEW_DIR;
X			strncpy(s130,cd_array[icd],sizeof(s130) - 1);
X			s130[sizeof(s130) - 1] = 0;
X		}
X	}
X	if(expand_dirname(s130,sizeof(s130)))
X		return(-1);
X	if(chdir(s130) < 0)		/* now change to the new directory */
X	{
X		perror(s130);		/* print error if we get one */
X		ff(se,"\r\n");
X		return(-1);
X	}
X	get_curr_dir(curr_dir,256);
X
X	fputs("\r\nconfirmed: ",se);
X	stand_out();
X	ff(se," %s ",curr_dir);
X	stand_end();
X	fputs("\r\n",se);
X	fflush(se);
X
X	for(icd = 0; icd < cd_in_use; icd++)
X	{
X		if(strcmp(curr_dir,cd_array[icd]) == 0)
X			return(0);
X	}
X	if(cd_in_use == CD_QUAN)
X	{
X		for(icd = 1; icd < CD_QUAN; icd++)
X		{
X			strcpy(cd_array[icd - 1],cd_array[icd]);
X		}
X		strcpy(cd_array[CD_QUAN - 1],curr_dir);
X	}
X	else
X		strcpy(cd_array[cd_in_use++],curr_dir);
X
X	return(0);
X
X}	/* end of change_directory */
X/* end of ecuchdir.c */
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
chmod 0644 ecuchdir.c || echo "restore of ecuchdir.c fails"
echo "x - extracting ecudump.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ecudump.c &&
X/* CHK=0x89CA */
X/*+-----------------------------------------------------------------------
X	ecudump.c  -- very generic hex/graphics dump development aid
X	Copyright 1986,1989 Warren H. Tucker, III. All Rights Reserved
X
X  Defined functions:
X	hex_dump(str,len,title,terse_flag)
X	hex_dump_fp(fp,str,len,title,terse_flag)
X	hex_dump16(int16)
X	hex_dump32(int32)
X	hex_dump4(int4)
X	hex_dump8(int8)
X
X------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-27-1989-15:49-wht-fix too many hyphens on odd-length titles */
X/*:07-11-1989-16:52-wht-no carriage returns output if dumpfp != stderr */
X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */
X/*:06-24-1989-16:52-wht-flush edits --- ecu 1.95 */
X
X#include "ecu.h"
X
Xstatic FILE *dumpfp;
X
X#define dump_putc(ch)		fputc((ch),dumpfp)
X#define dump_puts(str)		fputs(str,dumpfp)
X
X/*+-----------------------------------------------------------------------
X	hex_dump#... subservient routines
X------------------------------------------------------------------------*/
Xvoid hex_dump4(int4)
Xuchar int4;
X{
X	int4 &= 15;
X	dump_putc((int4 >= 10) ? (int4 + 'A' - 10) : (int4 + '0'));
X}
X
Xvoid hex_dump8(int8)
Xuchar int8;
X{
X	hex_dump4(int8 >> 4);
X	hex_dump4(int8);
X}
X
Xvoid hex_dump16(int16)
Xushort int16;
X{
X	hex_dump8(int16 >> 8);
X	hex_dump8(int16);
X}
X
Xvoid hex_dump32(int32)
Xulong int32;
X{
X	hex_dump16(int32 >> 16);
X	hex_dump16(int32);
X}
X
X
X/*+-----------------------------------------------------------------
X	hex_dump_fp(fp,str,len,title,terse_flag)
X
X  if 'title' not NULL, title is printed... 'terse_flag'
X  controls whether or not the title is "conspicuous" with
X  hyphens before and after it making title line >70 chars long
X------------------------------------------------------------------*/
Xvoid
Xhex_dump_fp(fp,str,len,title,terse_flag)
XFILE *fp;
Xchar *str;
Xint len;
Xchar *title;
Xint terse_flag;
X{
Xint istr;
Xregister ipos;
Xregister itmp;
X
X	dumpfp = fp;
X
X	if(title && (istr = strlen(title)))
X	{
X		if(!terse_flag)
X		{
X			ipos = (73 - istr) / 2;
X			itmp = ipos;
X			while(itmp--)
X				dump_putc('-');
X			dump_putc(' ');
X			if(istr & 1)
X				ipos--;
X		}
X		dump_puts(title);
X		if(!terse_flag)
X		{
X			dump_putc(' ');
X			while(ipos--)
X				dump_putc('-');
X		}
X		if(dumpfp == se)
X			dump_puts("\r\n");
X		else
X			dump_puts("\n");
X
X	}
X
X	istr = 0;
X	while(istr < len)
X	{
X		hex_dump16(istr);
X		dump_putc(' ');
X		for(itmp = 0; itmp < 16; ++itmp)
X		{
X			ipos = istr + itmp;
X			if(ipos >= len)
X			{
X				if(!terse_flag)
X					dump_puts("   ");
X				continue;
X			}
X			dump_putc(' ');
X			hex_dump8(str[ipos]);
X		}
X		dump_puts(" | ");
X		for(itmp = 0; itmp < 16; ++itmp)
X		{
X			ipos = istr + itmp;
X			if( (ipos) >= len)
X			{
X				if(!terse_flag)
X					dump_putc(' ');
X			}
X			else
X			{
X				dump_putc((str[ipos] >= ' ' && str[ipos] < 0x7f)
X		 			? str[ipos] : '.' );
X			}
X		}
X		if(dumpfp == se)
X			dump_puts(" |\r\n");
X		else
X			dump_puts(" |\n");
X		istr += 16;
X	}   /* end of while(istr < len) */
X
X}	/* end of hex_dump_fp */
X
X/*+-------------------------------------------------------------------------
X	hex_dump(str,len,title,terse_flag)
X--------------------------------------------------------------------------*/
Xvoid
Xhex_dump(str,len,title,terse_flag)
Xchar *str;
Xint len;
Xchar *title;
Xint terse_flag;
X{
X	hex_dump_fp(se,str,len,title,terse_flag);
X}	/* end of hex_dump_fp */
X/* end of ecudump.c */
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
chmod 0644 ecudump.c || echo "restore of ecudump.c fails"
echo "x - extracting ecufinsert.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ecufinsert.c &&
X/* CHK=0x291F */
X#define USE_XON_XOFF
X/*+-------------------------------------------------------------------------
X	ecufinsert.c -- insert file onto comm line
X	Copyright 1986,1989 Warren H. Tucker, III. All Rights Reserved
X
X  Defined functions:
X	file_insert_to_line(fname,arg_present_flag)
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */
X/*:06-27-1989-20:32-wht-allow wildcard spec or squiggle dir ref */
X/*:06-24-1989-16:52-wht-flush edits --- ecu 1.95 */
X
X#include "ecu.h"
X#include "ecukey.h"
X
Xextern int interrupt;
Xextern char kbdintr;		/* current input INTR */
X
X/*+-------------------------------------------------------------------------
X	expand_filename(fname) - convert fnames with shell chars
X--------------------------------------------------------------------------*/
Xexpand_filename(fname,maxlen)
Xchar *fname;
Xint maxlen;
X{
Xregister itmp;
Xregister char *cptr;
Xchar s256[256];
Xchar *expcmd;
X
X	if(!find_shell_chars(fname))
X		return(0);
X
X	sprintf(s256,"`ls %s`",fname);
X	if(expand_cmd_with_wildlist(s256,&expcmd))
X	{
X		ff(se,"\r\nNo files match\r\n");
X		return;
X	}
X	strncpy(fname,expcmd,maxlen);
X	fname[maxlen - 1] = 0;
X	if(strchr(expcmd,' '))
X	{
X		fputs("\r\nToo many files:\r\n",se);
X		fputs(expcmd,se);
X		fputs("\r\n",se);
X		free(expcmd);
X		return(-1);
X	}
X	free(expcmd);
X	return(0);
X
X}	/* end of expand_filename */
X
X/*+-------------------------------------------------------------------------
X	file_insert_to_line(narg,arg)
X--------------------------------------------------------------------------*/
Xfile_insert_to_line(narg,arg)
Xint narg;
Xchar **arg;
X{
Xchar insert_fname[128];
Xchar file_string[512];
Xchar response[8];
Xint single_flag;
Xint old_ttymode = get_ttymode();
XFILE *fopen();
XFILE *fp;
Xlong total_chars = 0L;
Xlong total_lines = 0L;
X#ifdef USE_XON_XOFF
Xint ixon;
Xint ixoff;
X#endif
X
X	if(narg > 1)
X		strncpy(insert_fname,arg[1],sizeof(insert_fname));	
X	else
X	{
X		ff(se,"\r\n--> File to insert on comm line: ");
X		ttygets(insert_fname,sizeof(insert_fname),1);
X		if( (insert_fname[0] == ESC) || (strlen(insert_fname) == 0) )
X		{
X			ff(se,"--> no transmission\r\n");
X			return(0);
X		}
X	}
X	if(expand_filename(insert_fname,sizeof(insert_fname)))
X		return(-1);
X	if((fp = fopen(insert_fname,"r")) == (FILE *)0)
X	{
X		ff(se,"--> ");
X		perror(insert_fname);			/* print error if we get one */
X		ff(se,"\r\n");
X		return(-1);
X	}
X
X	if(narg > 1)
X		ff(se,"\r\n");
X
X	if(narg > 2)
X		response[0] = *arg[2];
X	else
X	{
X		ff(se,"--> (S)ingle line at a time or (F)ull speed transmission:  ");
X		ttygets(response,sizeof(response),1);
X	}
X	single_flag = (to_lower(response[0]) == 's') ? 1 : 0;
X	if((single_flag == 0) && (to_lower(response[0]) != 'f'))
X	{
X		ff(se,"--> file insertion abandoned\r\n");
X		fclose(fp);
X		return(0);
X	}
X
X	if(single_flag)
X		ff(se,"--> press [space] to continue or 's' for stop\r\n");
X	else
X	{
X		ttymode(2);
X		ff(se,"--> press %s to abort\r\n",make_char_graphic(kbdintr,0));
X	}
X
X#ifdef USE_XON_XOFF
X	lget_xon_xoff(&ixon,&ixoff);		/* get current line xon/xoff status */
X	lxon_xoff(IXON | IXOFF);			/* set it for us */
X#endif
X
X	while( fgets(file_string,sizeof(file_string),fp) != NULL)
X	{
X		file_string[strlen(file_string) - 1] = 0;
X		total_chars += strlen(file_string);
X		total_lines++;
X		if(strlen(file_string) == 0)	/* some destinations do not */
X			lputc(' ');					/* like completely blank lines */
X		else
X			lputs(file_string);
X		lputc('\r');
X		if(interrupt)
X		{
X			interrupt = 0;
X			ff(se,"--> Interrupted\r\n");
X			break;
X		}
X		if(single_flag)
X		{
X			response[0] = ttygetc(0);
X			if(to_lower(response[0]) == 's')
X				break;
X		}
X		else
X			nap(60L);
X	}
X
X	ttymode(old_ttymode);		/* restore old console mode */
X#ifdef USE_XON_XOFF
X	lxon_xoff(ixon | ixoff);	/* restore old line xon/xoff status */
X#endif
X	fclose(fp);
X
X	ff(se,"\r\n-->  sent %ld lines, %ld characters\r\n",
X				total_lines,total_chars);
X	return(0);
X
X}	/* end of file_insert_to_line */
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
chmod 0644 ecufinsert.c || echo "restore of ecufinsert.c fails"
echo "x - extracting ecufkey.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ecufkey.c &&
X/* CHK=0xFCA6 */
X/*+-----------------------------------------------------------------
X	ecufkey.c -- XENIX function key definition
X	Copyright 1986,1989 Warren H. Tucker, III. All Rights Reserved
X
X  Defined functions:
X	keyset_display()
X	keyset_idnum(keystr)
X	keyset_idstr(keyid)
X	keyset_init()
X	keyset_read(keyset_name)
X	xf_to_keyid(xf)
X
X------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */
X/*:06-24-1989-16:52-wht-flush edits --- ecu 1.95 */
X
X#if defined(M_XENIX)	/* the entire module is bound by this cond. compile */
X#include "ecu.h"
X#include "ecukey.h"
X#include "ecufkey.h"
X#include "ecuxkey.h"
X#include "ecufork.h"
X
Xextern char kbdintr;	/* current input INTR */
Xextern char curr_dir[];	/* current working key defns */
X
XKDE		keyset_table[KDE_COUNT];
Xchar keyset_name[32] = "";
X
XXF_KDE_NAME xf_kde_name[] =
X{
X	{ XFcurup,	KDE_CUU,	"CUU" },
X	{ XFcurdn,	KDE_CUD,	"CUD" },
X	{ XFcurrt,	KDE_CUR,	"CUR" },
X	{ XFcurlf,	KDE_CUL,	"CUL" },
X	{ XFcur5,	KDE_CU5,	"CU5" },
X	{ XFend,	KDE_END,	"END" },
X	{ XFpgdn,	KDE_PGDN,	"PGDN" },
X	{ XFhome,	KDE_HOME,	"HOME" },
X	{ XFpgup,	KDE_PGUP,	"PGUP" },
X	{ XFins,	KDE_INS,	"INS" },
X	{ XF1,		KDE_F1,		"F1" },
X	{ XF2,		KDE_F2,		"F2" },
X	{ XF3,		KDE_F3,		"F3" },
X	{ XF4,		KDE_F4,		"F4" },
X	{ XF5,		KDE_F5,		"F5" },
X	{ XF6,		KDE_F6,		"F6" },
X	{ XF7,		KDE_F7,		"F7" },
X	{ XF8,		KDE_F8,		"F8" },
X	{ XF9,		KDE_F9,		"F9" },
X	{ XF10,		KDE_F10,	"F10" },
X	{ XF11,		KDE_F11,	"F11" },
X	{ XF12,		KDE_F12,	"F12" },
X	{ XFbktab,	KDE_BKTAB,	"BKTAB" },
X	{ 0,0,"" }
X};
X
X/*+-------------------------------------------------------------------------
X	keyset_init()
X--------------------------------------------------------------------------*/
Xvoid
Xkeyset_init()
X{
Xregister itmp;
Xregister KDE *tkde;
Xchar *make_char_graphic();
X
X	for(itmp = 0; itmp < KDE_COUNT; itmp++)
X	{
X		tkde = &keyset_table[itmp];
X		tkde->logical[0] = 0;
X		tkde->outcount = 0;
X		tkde->keyid = (uchar)itmp;
X	}
X
X	keyset_name[0] = 0;
X
X	tkde = &keyset_table[KDE_END];
X	strcpy(tkde->logical,
X		(kbdintr == 0x7F) ? "DEL" : make_char_graphic(kbdintr,0));
X	tkde->outstr[0] = kbdintr;
X	tkde->outcount = 1;
X
X	tkde = &keyset_table[KDE_HOME];
X	strcpy(tkde->logical,"ecu cmd");
X	tkde->outcount = KACT_COMMAND;
X
X	tkde = &keyset_table[KDE_INS];
X	strcpy(tkde->logical,"local shell");
X	tkde->outcount = KACT_LOCAL_SHELL;
X
X	tkde = &keyset_table[KDE_CU5];
X	strcpy(tkde->logical,"Screen dump");
X	tkde->outstr[0] = 0x7F;
X	tkde->outcount = 1;
X
X}	/* end of keyset_init */
X
X/*+-------------------------------------------------------------------------
X	keyset_idnum(keystr)
X--------------------------------------------------------------------------*/
Xkeyset_idnum(keystr)
Xchar *keystr;
X{
Xstruct XF_KDE_NAME *xkn = xf_kde_name;
X	while(xkn->xf != 0)
X	{
X		if(strcmp(xkn->name,keystr) == 0)
X			return((int)xkn->kde);
X		xkn++;
X	}
X	return(-1);
X}	/* end of keyset_idnum */
X
X/*+-------------------------------------------------------------------------
X	keyset_idstr(keyid)
X--------------------------------------------------------------------------*/
Xchar *
Xkeyset_idstr(keyid)
Xint keyid;
X{
Xstruct XF_KDE_NAME *xkn = xf_kde_name;
X	while(xkn->xf != 0)
X	{
X		if((int)xkn->kde == keyid)
X			return(xkn->name);
X		xkn++;
X	}
X	return((char *)0);
X}	/* end of keyset_idstr */
X
X/*+-------------------------------------------------------------------------
X	xf_to_keyid(xf)
X--------------------------------------------------------------------------*/
SHAR_EOF
echo "End of part 2"
echo "File ecufkey.c is continued in part 3"
echo "3" > s2_seq_.tmp
exit 0
-- 
-------------------------------------------------------------------
Warren Tucker, Tridom Corporation       ...!gatech!emory!tridom!wht 
Ker-au'-lo-phon.  An 8-foot partial flue-stop, having metal pipes
surmounted by adjustable rings, and with a hole bored near the top
of each pipe, producing a soft and "reedy" tone.