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

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

---- Cut Here and unpack ----
#!/bin/sh
# this is part 6 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file eculine.c continued
#
CurArch=6
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 eculine.c"
sed 's/^X//' << 'SHAR_EOF' >> eculine.c
X			Ltermio.c_cflag |= CS7 | PARENB | PARODD;
X			Ltermio.c_iflag |= ISTRIP;
X			break;
X		default:
X			ff(se,"invalid parity: %c ... defaulting to no parity\r\n");
X		case 0:
X		case 'n':
X			Ltermio.c_cflag |= CS8;
X			Ltermio.c_iflag &= ~(ISTRIP);
X			Lparity = 0;
X			break;
X	}			
X
X#if defined(HO_HUM)
X	if(ioctl_flag)
X#endif
X		 ioctl(Liofd,TCSETA,(char *)&Ltermio);
X
X}	/* end of lset_parity */
X
X/*+-------------------------------------------------------------------------
X	lclear_xmtr_xoff()
X--------------------------------------------------------------------------*/
Xvoid
Xlclear_xmtr_xoff()
X{
X	ioctl(Liofd,TCXONC,(char *)1); /* restart xmtr output */
X}	/* end of lclear_xmtr_xoff */
X
X/*+-------------------------------------------------------------------------
X	lbreak()
X--------------------------------------------------------------------------*/
Xvoid
Xlbreak()
X{
X	ioctl(Liofd,TCSBRK,(char *)0);
X}	/* end of lbreak */
X
X/*+----------------------------------------------------------------------
X	lopen()
Xreturns negative LOPEN_ codes if failure else positive pid using line
Xelse 0 if successful open
X------------------------------------------------------------------------*/
Xint
Xlopen()
X{
Xregister itmp = strlen(Lline);
Xstruct stat ttystat;
X
X	if(Liofd >= 0)
X		return(LOPEN_ALREADY);
X	if(isupper(Lline[itmp - 1]))
X		Lline[itmp - 1] = tolower(Lline[itmp - 1]);
X	if(!strcmp(Lline,"/dev/tty"))
X		return(LOPEN_INVALID);
X	if(itmp = lock_tty())		/* get lock file */
X		return(itmp);
X	if(stat(Lline,&ttystat) < 0)
X		return(LOPEN_NODEV);
X	Liofd = open(Lline,O_RDWR,0777);
X	if(Liofd < 0)
X		return(LOPEN_OPNFAIL);
X	else
X	{
X		ioctl(Liofd,TCGETA,(char *) &Ltermio);
X		Ltermio.c_iflag = (IGNPAR | IGNBRK | IXOFF );
X		Ltermio.c_cflag |= (CLOCAL | CREAD | HUPCL);
X		Ltermio.c_lflag = 0;
X
X		Ltermio.c_cc[VMIN]   = 1;
X		Ltermio.c_cc[VTIME]  = 1;
X		lset_baud_rate(0);		/* do not perform ioctl */
X		lset_parity(1);			/* do perform ioctl */
X	}
X
X	return(0);
X
X}	/* end of lopen */
X
X/*+-----------------------------------------------------------------------
X	lclose()
X------------------------------------------------------------------------*/
Xvoid
Xlclose()
X{
X	if(Liofd < 0)
X		return;
X	unlock_tty();	/* kill lock file (writes to line; must go before close) */
X	close(Liofd);
X	Liofd = -1;
X
X}	/* end of lclose */
X
X/*+-------------------------------------------------------------------------
X	ltoggle_dtr()
X--------------------------------------------------------------------------*/
Xvoid
Xltoggle_dtr()
X{
X	close(Liofd);
X	nap(300L);
X	Liofd = open(Lline,O_RDWR,0777);
X	ioctl(Liofd,TCSETA,(char *)&Ltermio);
X	nap(600L);
X}	/* end of ltoggle_dtr */
X
X/*+-------------------------------------------------------------------------
X	lxon_xoff(flag)
XIXON specifies whether or not we respond to xon/xoff characters
XIXOFF specifies whether or not we generate XON/XOFF characters
X--------------------------------------------------------------------------*/
Xvoid
Xlxon_xoff(flag)
Xint flag;
X{
X	if(flag & IXON)
X		Ltermio.c_iflag |= IXON;
X	else
X		Ltermio.c_iflag &= ~IXON;
X
X	if(flag & IXOFF)
X		Ltermio.c_iflag |= IXOFF;
X	else
X		Ltermio.c_iflag &= ~IXOFF;
X
X	ioctl(Liofd,TCSETA,(char *)&Ltermio);
X
X}	/* end of lxon_xoff */
X
X/*+-------------------------------------------------------------------------
X	lget_xon_xoff(ixon,ixoff)
X--------------------------------------------------------------------------*/
Xvoid
Xlget_xon_xoff(ixon,ixoff)
Xint *ixon;
Xint *ixoff;
X{
X	*ixon  = (Ltermio.c_iflag & IXON) != 0;
X	*ixoff = (Ltermio.c_iflag & IXOFF) != 0;
X}	/* end of lget_xon_xoff */
X
X/*+-------------------------------------------------------------------------
X	lopen_err_text(lerr)
X--------------------------------------------------------------------------*/
Xchar *
Xlopen_err_text(lerr)
Xint lerr;
X{
Xstatic char lerr_s40[40];
X
X	switch(lerr)
X	{
X		case LOPEN_INVALID: return("invalid line name");
X		case LOPEN_UNKPID: return("unknown pid is using line");
X		case LOPEN_LCKERR: return("error creating lock file");
X		case LOPEN_NODEV: return("line does not exist");
X		case LOPEN_ALREADY: return("line already open");
X		case LOPEN_OPNFAIL: return("line open error (not installed?)");
X		case LOPEN_ENABLED: return("line enabled for incoming login");
X		case LOPEN_ENABLED_IN_USE: return("line in use by incoming login");
X		case LOPEN_DIALOUT_IN_USE: return("line in use by another dial out");
X	}
X	if(lerr > 0)
X		sprintf(lerr_s40,"pid %d using line",lerr);
X	else
X		sprintf(lerr_s40,"unknown line error %d",lerr);
X	return(lerr_s40);
X}	/* end of lopen_err_text */
X
X/* end of eculine.c */
X
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
echo "File eculine.c is complete"
chmod 0644 eculine.c || echo "restore of eculine.c fails"
echo "x - extracting ecunumrev.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ecunumrev.c &&
X/* CHK=0x0985 */
X/*+-----------------------------------------------------------------------
X	ecunumrev.c
X	Copyright 1986,1989 Warren H. Tucker, III. All Rights Reserved
X------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */
X/*:06-24-1989-16:53-wht-flush edits --- ecu 1.95 */
X
Xchar *numeric_revision = "unet1";
X
X/* vi: set tabstop=4 shiftwidth=4: */
SHAR_EOF
chmod 0644 ecunumrev.c || echo "restore of ecunumrev.c fails"
echo "x - extracting ecuphone.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > ecuphone.c &&
X/* CHK=0x0280 */
X/*+-------------------------------------------------------------------------
X	ecuphone.c -- visual phone dialer/directory editor
X	Copyright 1986,1989 Warren H. Tucker, III. All Rights Reserved
X
X  .---[ title ]------------modified-.<-- dirw "top line"
X  |   stand out mode                |<-- dirw "header line"
X  |                                 |<-- scrw first line
X  |                                 |
X  |                                 |
X  |                                 |
X  |                                 |<-- scrw last line
X  |   stand out mode                |<-- dirw "cmd line"
X  `---------------------------------'<-- dirw bottom line
X
X  Defined functions:
X	check_curr_pde()
X	choose_line(baud)
X	copy_pde_to_lvar(tpde)
X	dirw_bot_msg(msg)
X	dirw_cmd_line_setup(prompt)
X	dirw_display_top()
X	dirw_get_cmd(prompt)
X	lookup_logical_telno()
X	pde_add_or_edit(tpde,edit)
X	pde_add_or_edit_read(prompt,edit,x,buf,max,delim)
X	pde_cmd_add(tpde)
X	pde_cmd_down()
X	pde_cmd_dump_list()
X	pde_cmd_find()
X	pde_cmd_remove()
X	pde_cmd_remove_oops()
X	pde_cmd_save()
X	pde_cmd_up()
X	pde_display(line,tpde,stand_out)
X	pde_display_logical(line,tpde,stand_out)
X	pde_list_add(tpde)
X	pde_list_erase()
X	pde_list_manager()
X	pde_list_read()
X	pde_list_remove(tpde)
X	pde_list_save_if_dirty()
X	pde_list_search(logical,exact_flag)
X	pde_list_set_dirty(flag)
X	scrw_fill(tpde,curr_pde_line)
X	scrw_fill_at(line_num,tpde,curr_pde_line)
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:08-31-1989-12:37-wht-was not always setting brate/parity properly */
X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */
X/*:06-24-1989-16:53-wht-flush edits --- ecu 1.95 */
X
X#include <curses.h>
X#include "pc_scr.h"
X
X#define STDIO_H_INCLUDED
X#define OMIT_TERMIO_REFERENCES
X#include "ecu.h"
X
X#include "ecupde.h"
X#include "ecukey.h"
X#include "ecuxkey.h"
X#include "ecuhangup.h"
X#include "utmpstatus.h"
X#include "dvent.h"
X
X#if defined(M_XENIX)
X#define DIAL	XFend
X#else
X#define DIAL	CTL_D
X#endif
X
Xvoid dirw_bot_msg();
X
X#if defined(M_XENIX)
Xchar *strchr();
Xchar *strrchr();
X#endif
X
X#if defined(pyr)
X#define strchr index
X#define strrchr rindex
Xchar *index();
Xchar *rindex();
X#endif
X
X/* window definitions */
X#define DIRW_LINES		(LINES - 1)
X#define DIRW_COLS		(COLS)
X#define DIRW_COLS		(COLS)
X#define DIRW_TOP_LINES	2
X#define DIRW_BOT_LINES	2
X#define DIRW_CMD_LINE	(DIRW_LINES - 2)
X#define SCRW_LINES		(DIRW_LINES - DIRW_TOP_LINES - DIRW_BOT_LINES)
X#define SCRW_COLS		(DIRW_COLS)
X#define SCRW_TLY		(DIRW_TOP_LINES)
X#define SCRW_TLX		0
X
Xextern int windows_active;
Xextern int rcvr_pid;
Xextern char errmsg[];
X
XWINDOW *dirw;
XWINDOW *scrw;
X
XPDE		*pde_list_head = (PDE *)0;	/* pointer to first pde in linked list */
XPDE		*curr_pde = (PDE *)0;		/* current pde */
XPDE		*remove_pde = (PDE *)0;		/* if non-zero, pde just removed */
Xint remove_dirty_flag;			/* pde_list_dirty at remove time */
Xint pde_list_quan = 0;			/* count of items in list now */
Xint pde_list_dirty = 0;			/* pde_list modified but not saved */
Xint scrw_curr_pde_line;			/* scrw line curr_pde is on */
Xchar ecuphone_name[256];			/* phone directory name */
X
X/*+-------------------------------------------------------------------------
X	pde_list_erase()
X--------------------------------------------------------------------------*/
Xvoid
Xpde_list_erase()
X{
Xregister PDE *pde = pde_list_head;
Xregister PDE *next;
X
X	while(pde)
X	{
X		next = pde->next;
X		free((char *)pde);
X		pde = next;
X	}
X	pde_list_head = (PDE *)0;
X	pde_list_quan = 0;
X}	/* end of pde_list_erase */
X
X/*+-------------------------------------------------------------------------
X	pde_list_set_dirty(flag)
X0: clean, 1 dirty, -1 do not modify;update screen only
X--------------------------------------------------------------------------*/
Xvoid
Xpde_list_set_dirty(flag)
Xint flag;
X{
Xregister itmp;
X	if(flag != pde_list_dirty)
X	{
X		if(flag != -1)
X			pde_list_dirty = flag;
X		wmove(dirw,0,DIRW_COLS - 14);
X		if(pde_list_dirty)
X			waddstr(dirw," modified ");
X		else
X		{
X			itmp = 10;
X			while(itmp--)
X				waddch(dirw,sHR);
X		}
X		wrefresh(dirw);
X	}
X}	/* end of pde_list_set_dirty */
X
X/*+-------------------------------------------------------------------------
X	pde_list_add(tpde) -- add to linked list
X--------------------------------------------------------------------------*/
Xvoid
Xpde_list_add(tpde)
XPDE *tpde;
X{
Xregister PDE *this = tpde;
Xregister PDE *prev;
Xregister PDE *next;
X
X/* if empty, init list with this one and quit */
X	if(pde_list_head == (PDE *)0)
X	{
X		pde_list_head = this;
X		this->next = (PDE *)0;
X		pde_list_quan++;
X		return;
X	}
X
X/* list not empty */
X	prev = (PDE *)0;		/* no previous yet */
X	next = pde_list_head;	/* init next to top of list */
X
X	while(strcmp(next->logical,this->logical) < 0)
X	{
X		prev = next;
X		next = prev->next;
X		if(next == (PDE *)0)
X			break;
X	}
X
X	if(prev)		/* if non-zero, we will not update the list head */
X	{
X		this->next = prev->next;
X		this->prev = prev;
X		prev->next = this;
X		if(next)
X			next->prev = this;
X	}
X	else	/* 'this' is to become the new list head (1st element) */
X	{
X		this->next = next;
X		this->prev = (PDE *)0;
X		if(next)
X			next->prev = this;
X		pde_list_head = this;
X	}
X	pde_list_quan++;
X
X}	/* end of pde_add */
X
X/*+-------------------------------------------------------------------------
X	pde_list_remove(tpde) -- add to linked list
X--------------------------------------------------------------------------*/
Xvoid
Xpde_list_remove(tpde)
Xregister PDE *tpde;
X{
Xregister PDE *prev;
Xregister PDE *next;
X
X	prev = (PDE *)0;	/* there is no previous now */
X
X	if((next = pde_list_head) == (PDE *)0)	/* if empty list */
X		return;
X
X	while(next != tpde)
X	{
X		prev = next;
X		next = prev->next;
X		if(next == (PDE *)0)
X			return;
X	}
X
X/* take care of "current pde" */
X	if(tpde == curr_pde)
X	{
X		if(tpde->next)
X			curr_pde = tpde->next;
X		else if(tpde->prev)
X			curr_pde = tpde->prev;
X		else
X			curr_pde = (PDE *)0;
X	}
X
X/* unlink */
X
X	if(prev)		/* if non-zero, we will not update the list head */
X	{
X		prev->next = tpde->next;
X		if(tpde->next)
X			(tpde->next)->prev = prev;
X	}
X	else
X	{
X		pde_list_head = tpde->next;
X		if(tpde->next)
X			(tpde->next)->prev = (PDE *)0;
X	}
X
X	tpde->next = (PDE *)0;
X	tpde->prev = (PDE *)0;
X
X	pde_list_quan--;
X}	/* end of pde_list_remove */
X
X/*+-----------------------------------------------------------------------
X	PDE *pde_list_search(logical,exact_flag)
X------------------------------------------------------------------------*/
XPDE *
Xpde_list_search(logical,exact_flag)
Xchar *logical;
Xint exact_flag;
X{
Xregister PDE *tpde;
X
X	if(!pde_list_quan)
X	{
X		if(pde_list_read())
X			return((PDE *)0);
X	}
X
X	tpde = pde_list_head;
X	while(tpde)
X	{
X		/* only first few chars necessary for match with ulcmpb */
X		if(exact_flag)
X		{
X			if(strcmp(tpde->logical,logical) == 0)
X				return(tpde);
X		}
X		else
X		{
X			if(ulcmpb(tpde->logical,logical) < 0)
X				return(tpde);
X		}
X		tpde = tpde->next;
X	}
X	if(!tpde)
X		sprintf(errmsg,"'%s' not found",logical);
X	return(tpde);
X
X}	/* end of pde_list_search */
X
X/*+-------------------------------------------------------------------------
X	pde_cmd_dump_list()
X--------------------------------------------------------------------------*/
X#if defined(PDE_DEBUG)
Xvoid
Xpde_cmd_dump_list()
X{
Xregister PDE *tpde = pde_list_head;
Xint count = 0;
X
X	curmove(LINES - 1,0);
X	while(tpde)
X	{
X		ff(se,"p:%04x t:%04x n:%04x %c %s\r\n",
X			tpde->prev,tpde,tpde->next,(tpde == curr_pde) ? '*' : ' ',
X			tpde->logical);
X		if((count++ % 15) == 14)
X		{
X			ff(se,"press return:  ");
X			ttygetc(1);
X			ff(se,"\r\n");
X		}
X		tpde = tpde->next;
X	}
X	ff(se,"press return:  ");
X	ttygetc(1);
X	touchwin(stdscr);
X	touchwin(dirw);
X	touchwin(scrw);
X	wrefresh(stdscr);
X	wrefresh(dirw);
X	wrefresh(scrw);
X
X}	/* end of pde_cmd_dump_list */
X#endif
X
X/*+-----------------------------------------------------------------------
X	pde_list_read()
Xsample .ecu/phone:
X#tri2:426-0624:2400:E:Tridom Pyramid        comment
Xarc:393-3083:2400:N:Atlanta Radio Club
X
Xreturn 0 if entire list read, else 1 if error (error msg in errmsg)
X------------------------------------------------------------------------*/
Xint
Xpde_list_read()
X{
Xregister itmp;
Xregister token_number;
Xregister char *cptr;
Xregister char *token;
Xchar readpde_buf[128];
Xchar s80[80];
XFILE *fp_phone;
XPDE		*tpde;
Xchar *str_token();
Xchar *malloc();
X
X	if(!ecuphone_name[0])
X	{
X		get_home_dir(ecuphone_name);
X		strcat(ecuphone_name,"/.ecu/phone");
X	}
X
X	if( (fp_phone = fopen(ecuphone_name,"r")) == NULL)
X	{
X		perror_errmsg(ecuphone_name);
X		return(1);
X	}
X
X/* we have an open .ecu/phone file */
X	pde_list_erase();		/* clear any previous directory */
X	while(fgets(readpde_buf,sizeof(readpde_buf),fp_phone) != NULL)
X	{
X		if(readpde_buf[0] == '#')		/* comment? */
X			continue;
X		if(itmp = strlen(readpde_buf))	/* itmp = len; if > 0 ... */
X		{
X			itmp--;
X			readpde_buf[itmp] = 0;		/* ... strip trailing NL */
X		}
X		cptr = readpde_buf;				/* first call to str_token, -> buff */
X		while((*cptr == 0x20) || (*cptr == TAB))
X			*cptr++;					/* strip leading spaces */
X		if(*cptr == 0)					/* if line all blank, skip it */
X			continue;
X
X		if((tpde = (PDE *)malloc(sizeof(PDE))) == (PDE *)0)
X		{
X			fclose(fp_phone);
X			strcpy(errmsg,"Out of memory reading phone list");
X			return(1);
X		}
X
X		tpde->descr[0] = 0;
X		tpde->logical[0] = 0;
X		tpde->telno[0] = 0;
X		tpde->tty[0] = 0;
X		tpde->parity = 0;
X		tpde->baud = 2400;
X		tpde->prev = (PDE *)0;
X		tpde->next = (PDE *)0;
X
X		token_number = 0;
X		while((token = str_token(cptr,":")) != NULL)
X		{
X			cptr = NULL;	/* further calls to str_token need NULL */
X			switch(token_number++)
X			{
X				case 0:		/* first field is logical name */
X					strncpy(tpde->logical,token,sizeof(tpde->logical));
X					tpde->logical[sizeof(tpde->logical) - 1] = 0;
X					break;
X				case 1:		/* second field is tpde->telno phone number */
X					strncpy(tpde->telno,token,sizeof(tpde->telno));
X					tpde->telno[sizeof(tpde->telno) - 1] = 0;
X					break;
X				case 2:		/* third field is line */
X					strncpy(tpde->tty,token,sizeof(tpde->tty));
X					tpde->tty[sizeof(tpde->tty) - 1] = 0;
X					break;
X				case 3:		/* fourth field is baud rate */
X					tpde->baud = atoi(token);
X					break;
X				case 4:		/* fifth field is parity */
X					switch(itmp = to_lower(token[0]))
X					{
X						case 'o':
X						case 'e':
X						case 'm':
X						case 's':
X							tpde->parity = itmp;
X							break;
X						default:
X						case 'n':
X							tpde->parity = 0;
X							break;
X					}
X					break;
X				default:
X					strncpy(tpde->descr,token,sizeof(tpde->descr));
X					tpde->descr[sizeof(tpde->descr) - 1] = 0;
X					break;
X			}	/* end of switch(token_number) */
X		}		/* end while not end of record */
X
X		pde_list_add(tpde);
X
X	}			/* while records left to ready */
X
X	fclose(fp_phone);
X	return(0);
X}	/* end of pde_list_read */
X
X/*+-----------------------------------------------------------------------
X	dirw_display_top()
X------------------------------------------------------------------------*/
Xvoid
Xdirw_display_top()
X{
X	wmove(dirw,1,1);
X	wstandout(dirw);
X	wprintw(dirw,
X" entry name %c telephone number %c tty %c baud P %c description                   ",
X		sVR,sVR,sVR,sVR);
X	wstandend(dirw);
X	wrefresh(dirw);
X}	/* end of dirw_display_top() */
X
X/*+-------------------------------------------------------------------------
X	dirw_bot_msg(msg)
X--------------------------------------------------------------------------*/
Xvoid
Xdirw_bot_msg(msg)
Xchar *msg;
X{
Xregister itmp;
Xregister itmp2;
Xstatic last_msglen = 0;
X#define DIRW_BOT_LINE_TLX 2
X#define DIRW_BOT_LINE_MAX_MSGLEN	(DIRW_COLS - DIRW_BOT_LINE_TLX - 8)
Xchar msg2[80];
X
X	if(!last_msglen && !strlen(msg))
X		return;
X
X	wmove(dirw,DIRW_LINES - 1,DIRW_BOT_LINE_TLX);
X
X	if((itmp = strlen(msg)) == 0)
X	{
X		itmp2 = last_msglen + 2;
X		for(itmp = 0; itmp < itmp2; itmp++)
X			waddch(dirw,sHR);
X		last_msglen = 0;
X	}
X	else
X	{
X		waddch(dirw,' ');
X		if(itmp > DIRW_BOT_LINE_MAX_MSGLEN)
X		{
X			strncpy(msg2,msg,DIRW_BOT_LINE_MAX_MSGLEN);
X			msg2[DIRW_BOT_LINE_MAX_MSGLEN + 1] = 0;
X			waddstr(dirw,msg2);
X			itmp = strlen(msg2);
X		}
X		else
X		{
X			waddstr(dirw,msg);
X			itmp = strlen(msg);
X		}
X		waddch(dirw,' ');
X		if((itmp2 = last_msglen - itmp) > 0)
X		{
X			while(itmp2--)
X				waddch(dirw,sHR);
X		}
X		last_msglen = itmp;		/* remember last message length */
X	}
X	wrefresh(dirw);
X}	/* end of dirw_bot_msg */
X
X/*+-------------------------------------------------------------------------
X	pde_display_logical(line,tpde,stand_out)
X--------------------------------------------------------------------------*/
Xpde_display_logical(line,tpde,stand_out)
Xint line;
XPDE		*tpde;
Xint stand_out;
X{
X	wmove(scrw,line,0);
X	waddch(scrw,sVR);
X
X	if(stand_out)
X		wstandout(scrw);
X	wprintw(scrw," %-10.10s",tpde->logical);
X	if(stand_out)
X		wstandend(scrw);
X
X}	/* end of pde_display_logical */
X
X/*+-----------------------------------------------------------------------
X	pde_display(win,line,tpde,stand_out)
X00000000001111111111222222222233333333334444444444555555555566666666667777777777
X01234567890123456789012345678901234567890123456789012345678901234567890123456789
X| entry name | telephone number | tty | baud P | description                   |
X| 0123456789 | 0123456789012345 | 01  | baud P | 01234567890123456789012345678 |
X--------------------------------------------------------------------------*/
Xpde_display(line,tpde,stand_out)
Xint line;
XPDE		*tpde;
Xint stand_out;
X{
X
X	pde_display_logical(line,tpde,stand_out);
X	waddch(scrw,' ');
X	waddch(scrw,sVR);
X	waddch(scrw,' ');
X	wprintw(scrw,"%-16.16s %c ",tpde->telno,sVR);
X	if(tpde->tty[0])
X		wprintw(scrw,"%-2.2s  %c",tpde->tty,sVR);
X	else
X		wprintw(scrw,"Any %c",sVR);
X	wprintw(scrw,"%5u %c %c ",tpde->baud,
X		(tpde->parity) ? to_upper(tpde->parity) : 'N',sVR);
X	wprintw(scrw,"%-29.29s %c",tpde->descr,sVR);
X	return(0);
X
X}	/* end of pde_display */
X
X/*+-----------------------------------------------------------------------
X	scrw_fill(first_pde,curr_pde_line)
X------------------------------------------------------------------------*/
Xvoid
Xscrw_fill(tpde,curr_pde_line)
Xregister PDE *tpde;
Xint *curr_pde_line;
X{
Xregister line;
Xregister is_curr_pde;
X
X	*curr_pde_line = -1;
X	for(line = 0; line < SCRW_LINES; line++)
X	{
X		if(tpde)
X		{
X			if(is_curr_pde = (tpde == curr_pde))
X				*curr_pde_line = line;
X			pde_display(line,tpde,(tpde == curr_pde));
X			tpde = tpde->next;
X		}
X		else
X		{
X			wmove(scrw,line,0);
X			waddch(scrw,sVR);
X			wclrtoeol(scrw);
X			wmove(scrw,line,SCRW_COLS - 1);
X			waddch(scrw,sVR);
X		}
X	}
X	wrefresh(scrw);
X
X}	/* end of scrw_fill */
X
X/*+-------------------------------------------------------------------------
X	scrw_fill_at(line_num,first_pde,curr_pde_line)
X--------------------------------------------------------------------------*/
Xvoid
Xscrw_fill_at(line_num,tpde,curr_pde_line)
Xint line_num;
Xregister PDE *tpde;
Xint *curr_pde_line;
X{
Xregister itmp;
X
X	if(!tpde)
X	{
X		wclear(scrw);
X		wrefresh(scrw);
X		return;
X	}
X	for(itmp = 0; itmp < line_num; itmp++)
X	{
X		if(!tpde->prev)
X			break;
X		tpde = tpde->prev;
X	}
X
X	scrw_fill(tpde,curr_pde_line);
X
X}	/* end of scrw_fill_at */
X
X/*+-------------------------------------------------------------------------
X	dirw_cmd_line_setup(prompt)
X--------------------------------------------------------------------------*/
Xvoid
Xdirw_cmd_line_setup(prompt)
Xchar *prompt;
X{
Xregister icol;
Xint y;
Xint x;
X
X	wmove(dirw,DIRW_CMD_LINE,1);
X	wstandout(dirw);
X	waddch(dirw,' ');
X	waddstr(dirw,prompt);
X	waddch(dirw,' ');
X	getyx(dirw,y,x);
X	for(icol = x; icol < DIRW_COLS - 1; icol++)
X		waddch(dirw,' ');
X	wmove(dirw,y,x);
X	wstandend(dirw);
X	wrefresh(dirw);
X}	/* end of dirw_cmd_line_setup */
X
X/*+-------------------------------------------------------------------------
X	dirw_get_cmd()
X--------------------------------------------------------------------------*/
Xuchar
Xdirw_get_cmd(prompt)
Xchar *prompt;
X{
Xregister uchar cmd;
X
X	dirw_cmd_line_setup(prompt);
X	cmd = ttygetc(1);
X	dirw_bot_msg("");
X	return(cmd);
X
X}	/* end of dirw_get_cmd */
X
X/*+-------------------------------------------------------------------------
X	pde_cmd_save()
X--------------------------------------------------------------------------*/
Xvoid
Xpde_cmd_save()
X{
XFILE *fpold;
XFILE *fpnew;
XPDE		*tpde;
Xchar ecuphone_ntmp[256];		/* temp phone directory name */
Xchar iobuf[128];
Xint count = 0;
X
X	if(!pde_list_dirty)
X	{
X		dirw_bot_msg("directory has not been modified");
X		return;
X	}
X
X	strcpy(ecuphone_ntmp,ecuphone_name);
X	strcat(ecuphone_ntmp,".t");
X
X	if((fpnew = fopen(ecuphone_ntmp,"w")) == NULL)	/* open old file */
X	{
X		sprintf(iobuf,"cannot open %s",ecuphone_ntmp);
X		dirw_bot_msg(iobuf);
X		return;
X	}
X
X/* retain commented entries */
X	if((fpold = fopen(ecuphone_name,"r")) != NULL)	/* open old file */
X	{
X		while(fgets(iobuf,sizeof(iobuf),fpold) != NULL)
X		{
X			if(iobuf[0] == '#')
X				fputs(iobuf,fpnew);
X		}
X		fclose(fpold);
X	}
X
X/* write new entries */
X	tpde = pde_list_head;
X	while(tpde)
X	{
X		sprintf(iobuf,"%d",count+1);
X		dirw_bot_msg(iobuf);
X		sprintf(iobuf,"%s:%s:%s:%u:%c:%s\n",tpde->logical,tpde->telno,
X			tpde->tty,tpde->baud,
X			(tpde->parity) ? to_upper(tpde->parity) : 'N',
X			tpde->descr);
X		fputs(iobuf,fpnew);
X		tpde = tpde->next;
X		count++;
X	}
X
X	fclose(fpnew);
X	unlink(ecuphone_name);
X	rename(ecuphone_ntmp,ecuphone_name);
X	sprintf(iobuf,"saved %d entries",count);
X	dirw_bot_msg(iobuf);
X	pde_list_set_dirty(0);
X
X}	/* end of pde_cmd_save */
X
X/*+-------------------------------------------------------------------------
X	pde_list_save_if_dirty()
X--------------------------------------------------------------------------*/
Xvoid
Xpde_list_save_if_dirty()
X{
Xint cmd = 0;
X
X	if(pde_list_dirty)
X	{
X		while(!cmd)
X		{
X			ring_bell();
X			cmd = dirw_get_cmd("directory modified: save?");
X			if(isupper(cmd))
X				cmd = tolower(cmd);
X			switch(cmd)
X			{
X				case 'y': pde_cmd_save(); break;
X				case 'n': break;
X				default:
X					ring_bell();
X					cmd = 0;
X					break;		
X			}
X		}
X	}
X}	/* end of pde_list_save_if_dirty */
X
X/*+-------------------------------------------------------------------------
X	pde_cmd_up()
X--------------------------------------------------------------------------*/
Xvoid
Xpde_cmd_up()
X{
Xregister itmp;
Xregister PDE *tpde;
X
X	if((!curr_pde) || (curr_pde->prev == (PDE *)0))
X	{
X		ring_bell();
X		return;
X	}
X	if(scrw_curr_pde_line)
X	{
X		pde_display_logical(scrw_curr_pde_line,curr_pde,0);
X		curr_pde = curr_pde->prev;
X		pde_display_logical(--scrw_curr_pde_line,curr_pde,1);
X	}
X	else
X	{
X		tpde = curr_pde;
X		curr_pde = curr_pde->prev;
X		scrw_fill_at(10,tpde,&scrw_curr_pde_line);
X	}
X
X}	/* end of pde_cmd_up */
X
X/*+-------------------------------------------------------------------------
X	pde_cmd_down()
X--------------------------------------------------------------------------*/
Xvoid
Xpde_cmd_down()
X{
Xregister itmp;
Xregister PDE *tpde;
X
X	if((!curr_pde) || (curr_pde->next == (PDE *)0))
X	{
X		ring_bell();
X		return;
X	}
X	if(scrw_curr_pde_line < (SCRW_LINES - 1))
X	{
X		pde_display_logical(scrw_curr_pde_line,curr_pde,0);
X		curr_pde = curr_pde->next;
X		pde_display_logical(++scrw_curr_pde_line,curr_pde,1);
X	}
X	else
X	{
X		tpde = curr_pde;
X		curr_pde = curr_pde->next;
X		scrw_fill_at(SCRW_LINES - 10,tpde,&scrw_curr_pde_line);
X	}
X
X}	/* end of pde_cmd_down */
X
X/*+-------------------------------------------------------------------------
X	check_curr_pde() -- return 1 if there is a current pde, else 0
X--------------------------------------------------------------------------*/
Xcheck_curr_pde()
X{
X	if(!curr_pde)
X	{
X		dirw_bot_msg("no directory entry selected");
X		return(0);
X	}
X	return(1);
X}	/* end of check_curr_pde */
X
X/*+-------------------------------------------------------------------------
X	pde_add_or_edit_read(prompt,edit,x,buf,max,delim)
Xmax must not wrap around to another line
X--------------------------------------------------------------------------*/
Xpde_add_or_edit_read(prompt,edit,x,buf,max,delim)
Xchar *prompt;
Xint edit;
Xint x;
Xchar *buf;
Xint max;
Xchar *delim;
X{
Xregister itmp;
Xchar s82[82];
X
X	while(1)
X	{
X		dirw_cmd_line_setup(prompt);
X		wstandout(scrw);
X		itmp = wingets(scrw,scrw_curr_pde_line,x,s82,max,delim,edit);
X		wstandend(scrw);
X		
X		switch(*delim)
X		{
X			case ESC:
X				return;
X
X			case CR:
X			case NL:
X				if(edit && (itmp == 0))
X				{
X					*delim = TAB;
X					return;
X				}
X				strcpy(buf,s82);
X				return;
X
X			case CTL_B:
X				*buf = 0;
X				return;
X
X			case TAB:
X				if(!edit)
X					continue;
X				*buf = 0;
X				return;
X
X			default:
X				break;
X		}
X	}
X}	/* end of pde_add_or_edit_read */
X
X/*+-------------------------------------------------------------------------
X	pde_add_or_edit(tpde,edit)
Xif called with edit == 1, tpde MUST == curr_pde !!!
X00000000001111111111222222222233333333334444444444555555555566666666667777777777
X01234567890123456789012345678901234567890123456789012345678901234567890123456789
X| entry name | telephone number | tty | baud P | description                   |
X| 0123456789 | 0123456789012345 | 01  | baud P | 01234567890123456789012345678 |
X--------------------------------------------------------------------------*/
Xint
Xpde_add_or_edit(tpde,edit)
Xregister PDE *tpde;
Xint edit;
X{
Xregister itmp;
Xint input_state = 0;
Xchar s50[50];
Xchar delim;
Xint done = 0;
Xint y,x;
XPDE		*old_curr_pde;
Xuint baud;
X
X	if(!edit)
X	{
X		dirw_bot_msg("ESC: abort  ^U: erase input");
X		dirw_cmd_line_setup("Enter new directory entry name: ");
X		getyx(dirw,y,x);
X		wstandout(dirw);
X		wingets(dirw,y,x,tpde->logical,10+1,&delim,0);
X		wstandend(dirw);
X		if((!strlen(tpde->logical)) || (tpde->logical[0] == ESC))
X		{
X			dirw_bot_msg("add aborted");
X			return(0);
X		}
X	
X		if(!isalpha(tpde->logical[0]))
X		{
X			dirw_bot_msg("first character must be alphabetic");
X			return(0);
X		}
X
X		if(pde_list_search(tpde->logical,1))
X		{
X			sprintf(s50,"'%s' is already in the directory",tpde->logical);
X			dirw_bot_msg(s50);
X			return(0);
X		}
X
X		tpde->descr[0] = 0;
X		tpde->telno[0] = 0;
X		tpde->tty[0] = 0;
X		tpde->parity = '-';
X		tpde->baud = 0;				
X	
X		pde_list_add(tpde);
X		old_curr_pde = curr_pde;
X		curr_pde = tpde;
X		scrw_fill_at(SCRW_LINES / 2,tpde,&scrw_curr_pde_line);
SHAR_EOF
echo "End of part 6"
echo "File ecuphone.c is continued in part 7"
echo "7" > 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.