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

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

---- Cut Here and unpack ----
#!/bin/sh
# this is part 20 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file regexp.c continued
#
CurArch=20
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 regexp.c"
sed 's/^X//' << 'SHAR_EOF' >> regexp.c
X		return(advance(p1,p2));
X	}
X	/* fast check for first character */
X	if(*p2==CCHR)
X	{
X		c = p2[1];
X		do 
X		{
X			if(*p1 != c)
X				continue;
X			if(advance(p1,p2))
X			{
X				match_start = p1;
X				return(1);
X			}
X		} while(*p1++);
X		return(0);
X	}
X	/* regular algorithm */
X	do 
X	{
X		if(advance(p1,p2))
X		{
X			match_start = p1;
X			return(1);
X		}
X	} while(*p1++);
X	return(0);
X}
X
Xadvance(lp,ep)
Xregister char *lp,*ep;
X{
X	register char *curlp;
X	char c;
X	char *bbeg;
X	int ct;
X
X	while(1)
X		switch(*ep++)
X		{
X
X		case CCHR:
X			if(*ep++ == *lp++)
X				continue;
X			return(0);
X
X		case CDOT:
X			if(*lp++)
X				continue;
X			return(0);
X
X		case CDOL:
X			if(*lp==0)
X				continue;
X			return(0);
X
X		case CCEOF:
X			match_end = lp;
X			return(1);
X
X		case CCL:
X			c = *lp++ & 0177;
X			if(ISTHERE(c))
X			{
X				ep += 16;
X				continue;
X			}
X			return(0);
X		case CBRA:
X			braslist[*ep++] = lp;
X			continue;
X
X		case CKET:
X			braelist[*ep++] = lp;
X			continue;
X
X		case CCHR|RNGE:
X			c = *ep++;
X			getrnge(ep);
X			while(low--)
X				if(*lp++ != c)
X					return(0);
X			curlp = lp;
X			while(size--)
X				if(*lp++ != c)
X					break;
X			if(size < 0)
X				lp++;
X			ep += 2;
X			goto star;
X
X		case CDOT|RNGE:
X			getrnge(ep);
X			while(low--)
X				if(*lp++ == '\0')
X					return(0);
X			curlp = lp;
X			while(size--)
X				if(*lp++ == '\0')
X					break;
X			if(size < 0)
X				lp++;
X			ep += 2;
X			goto star;
X
X		case CCL|RNGE:
X			getrnge(ep + 16);
X			while(low--)
X			{
X				c = *lp++ & 0177;
X				if(!ISTHERE(c))
X					return(0);
X			}
X			curlp = lp;
X			while(size--)
X			{
X				c = *lp++ & 0177;
X				if(!ISTHERE(c))
X					break;
X			}
X			if(size < 0)
X				lp++;
X			ep += 18;		/* 16 + 2 */
X			goto star;
X
X		case CBACK:
X			bbeg = braslist[*ep];
X			ct = braelist[*ep++] - bbeg;
X
X			if(ecmp(bbeg,lp,ct))
X			{
X				lp += ct;
X				continue;
X			}
X			return(0);
X
X		case CBACK|STAR:
X			bbeg = braslist[*ep];
X			ct = braelist[*ep++] - bbeg;
X			curlp = lp;
X			while(ecmp(bbeg,lp,ct))
X				lp += ct;
X
X			while(lp >= curlp)
X			{
X				if(advance(lp,ep))	return(1);
X				lp -= ct;
X			}
X			return(0);
X
X
X		case CDOT|STAR:
X			curlp = lp;
X			while(*lp++);
X			goto star;
X
X		case CCHR|STAR:
X			curlp = lp;
X			while(*lp++ == *ep);
X			ep++;
X			goto star;
X
X		case CCL|STAR:
X			curlp = lp;
X			do 
X			{
X				c = *lp++ & 0177;
X			} while(ISTHERE(c));
X			ep += 16;
X			goto star;
X
Xstar:
X			do 
X			{
X				if(--lp == locs)
X					break;
X				if(advance(lp,ep))
X					return(1);
X			} while(lp > curlp);
X			return(0);
X
X		}
X}
X
Xgetrnge(regexp)
Xregister char *regexp;
X{
X	low = *regexp++ & 0377;
X	size = ((*regexp & 0377) == 255) ? 20000 : (*regexp & 0377) - low;
X}
X
Xecmp(a,b,count)
Xregister char *a,*b;
Xregister count;
X{
X	while(count--)
X		if(*a++ != *b++)
X			return(0);
X	return(1);
X}
X
X/*+-------------------------------------------------------------------------
X	itmp = regexp_compile(regexp,cmpbuf,cmpbuf_size,emsg)
X
Xreturns 0 if no compile error,
Xelse error occurred (*emsg points to error message text)
X--------------------------------------------------------------------------*/
Xint
Xregexp_compile(regexp,cmpbuf,cmpbuf_size,emsg)
Xchar *regexp;
Xchar *cmpbuf;
Xint cmpbuf_size;
Xchar **emsg;
X{
X	register int itmp;
X	static char errm[40];
X
X	if(itmp = setjmp(compile_error_jmpbuf))
X	{
X		switch(itmp)
X		{
X		case 11:	
X			*emsg = "Range endpoint too large"; 
X			break;
X		case 16:	
X			*emsg = "Bad number"; 
X			break;
X		case 25:	
X			*emsg = "\"\\digit\" out of range"; 
X			break;
X		case 36:	
X			*emsg = "Illegal or missing delimiter"; 
X			break;
X		case 41:	
X			*emsg = "No previous regular expression"; 
X			break;
X		case 42:	
X			*emsg = "More \\)'s than \\('s in regular expression";
X			break;
X		case 43:	
X			*emsg = "More \\('s than \\)'s in regular expression";
X			break;
X		case 44:	
X			*emsg = "More than 2 numbers in \\{ \\}"; 
X			break;
X		case 45:	
X			*emsg = "} expected after \\"; 
X			break;
X		case 46:	
X			*emsg = "First number exceeds second in \\{ \\}"; 
X			break;
X		case 49:	
X			*emsg = "[] imbalance"; 
X			break;
X		case 50:	
X			*emsg = "Regular expression too complex"; 
X			break;
X		default:	
X			sprintf(errm,"Unknown regexp compile error %d",itmp);
X			*emsg = errm;
X			break;
X		}
X		return(itmp);
X	}
X
X	compile(regexp,cmpbuf,cmpbuf + cmpbuf_size,0);
X	return(0);
X}	/* end of regexp_compile */
X
X/*+-------------------------------------------------------------------------
X	regexp_scan(cmpbuf,str_to_search,&match,&matchlen)
Xreturn 1 if string match found, else 0
Xif string matches, match receives pointer to first byte, matchlen = length
Xof matching string
X--------------------------------------------------------------------------*/
Xregexp_scan(cmpbuf,str_to_search,match,matchlen)
Xchar *cmpbuf;
Xchar *str_to_search;
Xchar **match;
Xint *matchlen;
X{
X	register int itmp = step(str_to_search,cmpbuf);
X	if(itmp)
X	{
X		*match = match_start;
X		*matchlen = (int)(match_end - match_start);
X	}
X	return(itmp);
X}	/* end of regexp_scan */
X
X#define CMPBUF_SIZE	256
Xchar cmpbuf[CMPBUF_SIZE];
X
X/*+-------------------------------------------------------------------------
X	regexp_operation(match_str,regexp_str,rtn_value)
X--------------------------------------------------------------------------*/
Xint
Xregexp_operation(match_str,regexp_str,rtn_value)
Xchar *match_str;
Xchar *regexp_str;
Xlong *rtn_value;
X{
Xchar *emsg;
Xchar *match;
Xint matchlen;
X
X	if(regexp_compile(regexp_str,cmpbuf,sizeof(cmpbuf),&emsg))
X	{
X		pprintf("compile 1 error: %s\n",emsg);
X		return(eFATAL_ALREADY);
X	}
X
X	if(regexp_scan(cmpbuf,match_str,&match,&matchlen))
X	{
X		*rtn_value = (long)(match - match_str);
X		iv[0] = (long)matchlen;
X		if(proc_level && proctrace)
X			pprintf("%match set $i00 = %ld\n",iv[0]);
X	}
X	else
X		*rtn_value = -1;
X
X	return(0);
X}	/* end of regexp_operation */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of regexp.c */
SHAR_EOF
echo "File regexp.c is complete"
chmod 0644 regexp.c || echo "restore of regexp.c fails"
echo "x - extracting smap.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > smap.c &&
X/* CHK=0x3FFC */
X/*
X *	@(#)smap.c	1.2	30/08/88	16:28:19	agc
X *
X *	Copyright 1988, Joypace Ltd., UK. This product is "careware".
X *	If you find it useful, I suggest that you send what you think
X *	it is worth to the charity of your choice.
X *
X *	Alistair G. Crooks,				+44 5805 3114
X *	Joypace Ltd.,
X *	2 Vale Road,
X *	Hawkhurst,
X *	Kent TN18 4BU,
X *	UK.
X *
X *	UUCP Europe                 ...!mcvax!unido!nixpbe!nixbln!agc
X *	UUCP everywhere else ...!uunet!linus!nixbur!nixpbe!nixbln!agc
X *
X *	smap.c - source file for debugging aids.
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 <stdio.h>
X#include <signal.h>
X#include "stdio_lint.h"
X#include "lint_args.h"
X
Xtypedef struct _slotstr
X{
X	char *s_ptr;				/* the allocated area */
X	unsigned int s_size;		/* its size */
X	char s_freed;				/* whether it's been freed yet */
X	char s_blkno;				/* program block reference number */
X} SLOT;
X
X#ifndef MAXSLOTS
X#define MAXSLOTS	4096
X#endif /* MAXSLOTS */
X
Xstatic SLOT	slots[MAXSLOTS];
Xstatic int slotc;
Xstatic int blkno;
X
X#define WARNING(s1, s2)		(void) fprintf(stderr, s1, s2)
X
Xchar *malloc();
Xchar *calloc();
Xchar *realloc();
Xvoid _abort();
X
X/*+-------------------------------------------------------------------------
X	_dump_malloc()
X--------------------------------------------------------------------------*/
Xvoid
X_dump_malloc()
X{
Xregister islot;
Xregister slot_count = 0;
Xchar dfile[32];
Xchar title[64];
XFILE *fp;
XSLOT *slot;
X
X	sprintf(dfile,"/tmp/m%05d.dmp",getpid());
X	fp = fopen(dfile,"w");
X	fprintf(stderr,"\r\n\n\ndumping to %s\r\n",dfile);
X	for(islot = 0; islot < slotc; islot++)
X	{
X		slot = &slots[islot];
X		if(slot->s_freed)
X			continue;
X		sprintf(title,"%d (%d) %08x size %u",
X			slot_count,islot,slot->s_ptr,slot->s_size);
X		hex_dump_fp(fp,slot->s_ptr,slot->s_size,title,0);
X		slot_count++;
X	}
X	fclose(fp);
X	fprintf(stderr,"done\r\n");
X
X}	/* end of _dump_malloc */
X
X
X/*
X *	_malloc - wrapper around malloc. Warns if unusual size given, or the
X *	real malloc returns a NULL pointer. Returns a pointer to the
X *	malloc'd area
X */
Xchar *
X_malloc(size)
Xunsigned int size;
X{
X	SLOT *sp;
X	char *ptr;
X	int i;
X
X	if(size == 0)
X		WARNING("_malloc: unusual size %d bytes\r\n",size);
X	if((ptr = (char *) malloc(size)) == (char *) NULL)
X		_abort("_malloc: unable to malloc %u bytes\r\n",size);
X	for(i = 0,sp = slots ; i < slotc ; i++,sp++)
X		if(sp->s_ptr == ptr)
X			break;
X	if(i == slotc)
X	{
X		if(slotc == MAXSLOTS - 1)
X		{
X			_dump_malloc();
X			_abort("_malloc: run out of slots\r\n",(char *) NULL);
X		}
X		sp = &slots[slotc++];
X	}
X	else if(!sp->s_freed)
X		WARNING("_malloc: malloc returned a non-freed pointer\r\n",NULL);
X	sp->s_size = size;
X	sp->s_freed = 0;
X	sp->s_ptr = ptr;
X	sp->s_blkno = blkno;
X#ifndef NO_EXTRA_HELP
X	memset(sp->s_ptr,0x12,sp->s_size);
X#endif
X	return(sp->s_ptr);
X}
X
X
X/*
X *	_calloc - wrapper for calloc. Calls _malloc to allocate the area, and
X *	then sets the contents of the area to NUL bytes. Returns its address.
X */
Xchar *
X_calloc(nel,size)
Xint nel;
Xunsigned int size;
X{
X	unsigned int tot;
X	char *ptr;
X	char *cp;
X
X	tot = nel * size;
X	ptr = _malloc(tot);
X	if((cp = ptr) == (char *) NULL)
X		return((char *) NULL);
X	while(tot--)
X		*cp++ = 0;
X	return(ptr);
X}
X
X
X/*
X *	_realloc - wrapper for realloc. Checks area already alloc'd and
X *	not freed. Returns its address
X */
Xchar *
X_realloc(ptr,size)
Xchar *ptr;
Xunsigned int size;
X{
X	SLOT *sp;
X	int i;
X
X	for(i = 0,sp = slots ; i < slotc ; i++,sp++)
X		if(sp->s_ptr == ptr)
X			break;
X	if(i == slotc)
X		_abort("_realloc: realloc on unallocated area\r\n",(char *) NULL);
X	if(sp->s_freed)
X		WARNING("_realloc: realloc on freed area\r\n",(char *) NULL);
X	if((sp->s_ptr = (char *) realloc(ptr,size)) == (char *) NULL)
X		WARNING("_realloc: realloc failure %d bytes\r\n",size);
X	sp->s_size = size;
X	sp->s_blkno = blkno;
X	return(sp->s_ptr);
X}
X
X
X/*
X *	_free - wrapper for free. Loop through allocated slots, until you
X *	find the one corresponding to pointer. If none, then it's an attempt
X *	to free an unallocated area. If it's already freed, then tell user.
X */
Xvoid
X_free(ptr)
Xchar *ptr;
X{
X	SLOT *sp;
X	int i;
X
X	for(i = 0,sp = slots ; i < slotc ; i++,sp++)
X		if(sp->s_ptr == ptr)
X			break;
X	if(i == slotc)
X		_abort("_free: free not previously malloc'd\r\n",(char *) NULL);
X	if(sp->s_freed)
X		_abort("_free: free after previous freeing\r\n",(char *) NULL);
X	(void) free(sp->s_ptr);
X	sp->s_freed = 1;
X}
X
X
X/*
X *	_blkstart - start of a program block. Increase the block reference
X *	number by one.
X */
Xvoid
X_blkstart()
X{
X	blkno += 1;
X}
X
X
X/*
X *	_blkend - end of a program block. Check all areas allocated in this
X *	block have been freed. Decrease the block number by one.
X */
Xvoid
X_blkend()
X{
X	SLOT *sp;
X	int i;
X
X	if(blkno == 0)
X	{
X		WARNING("_blkend: unmatched call to _blkend\r\n",NULL);
X		return;
X	}
X	for(i = 0,sp = slots ; i < slotc ; i++,sp++)
X		if(sp->s_blkno == blkno && !sp->s_freed)
X			WARNING("_blkend: %d bytes unfreed\r\n",sp->s_size);
X	blkno -= 1;
X}
X
X
X/*
X *	_blkignore - find the slot corresponding to ptr, and set its block
X *	number to zero, to avoid _blkend picking it up when checking.
X */
Xvoid
X_blkignore(ptr)
Xchar *ptr;
X{
X	SLOT *sp;
X	int i;
X
X	for(i = 0,sp = slots ; i < slotc ; i++,sp++)
X		if(sp->s_ptr == ptr)
X			break;
X	if(i == slotc)
X		WARNING("_blkignore: pointer has not been allocated\r\n",NULL);
X	else
X		sp->s_blkno = 0;
X}
X
X/*
X *	_abort - print a warning on stderr, and send a SIGQUIT to ourself
X */
X#if !defined(BUILDING_LINT_ARGS)
Xstatic void
X_abort(s1,s2)
Xchar *s1;
Xchar *s2;
X{
X	WARNING(s1,s2);
X	(void) kill(getpid(),SIGQUIT);	/* core dump here */
X}
X#endif
SHAR_EOF
chmod 0644 smap.c || echo "restore of smap.c fails"
echo "x - extracting sysdep.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > sysdep.c &&
X/* CHK=0x2755 */
X/*+-------------------------------------------------------------------------
X	sysdep.c -- system dependency aid
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-06-1989-15:06-wht-added i386 */
X/*:02-27-1989-21:59-wht-add M_I286 and M_I386 */
X/*:11-17-1988-15:17-wht-creation */
X
X#include <stdio.h>
X
Xchar	*defines[] =
X{
X#if defined(M_XENIX)
X	"M_XENIX",
X#endif
X#if defined(M_I386)
X	"M_I386",
X#endif
X#if defined(M_I286)
X	"M_I286",
X#endif
X#if defined(pyr)
X	"pyr",
X#endif
X#if defined(i386)
X	"i386",
X#endif
X	(char *)0
X};
X
X/*+-------------------------------------------------------------------------
X	pos_in_ztermed_list(test,list)
X--------------------------------------------------------------------------*/
Xint
Xpos_in_ztermed_list(test,list)
Xchar	*test;
Xchar	**list;
X{
X	register int itmp = 0;
X
X	while(*list)
X	{
X		if(!strcmp(*list++,test))
X			return(itmp);
X		itmp++;
X	}
X	return(-1);
X}	/* end of pos_in_ztermed_list */
X
X/*+-------------------------------------------------------------------------
X	main(argc,argv,envp)
X--------------------------------------------------------------------------*/
Xmain(argc,argv,envp)
Xint argc;
Xchar	**argv;
Xchar	**envp;
X{
X	register int iargv;
X
X	for(iargv = 1; iargv < argc; iargv++)
X	{
X		if(*argv[iargv] == '=')
X		{
X			if(pos_in_ztermed_list(argv[iargv] + 1,defines) >= 0)
X				break;
X		}
X	}
X	if(iargv == argc)
X	{
X		fprintf(stderr,"\n\nsysdep: no system match\n\n");
X		exit(1);
X	}
X
X	while(++iargv <argc)
X	{
X		if(*argv[iargv] == '=')
X			break;
X		fputs(argv[iargv],stdout);
X		fputc(' ',stdout);
X	}
X	fputs("\n",stdout);
X	exit(0);
X}	/* end of main */
X
SHAR_EOF
chmod 0644 sysdep.c || echo "restore of sysdep.c fails"
echo "x - extracting var.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > var.c &&
X/* CHK=0x2B08 */
X/*+-------------------------------------------------------------------------
X	var.c - ecu variable routines
X	Copyright 1989 Warren H. Tucker, III. All Rights Reserved
X
X  Defined functions:
X	alloc_MKV(name)
X	build_mkvi(param)
X	build_mkvs(param)
X	cmd_mkvar(param)
X	find_mkvi(name,pplong)
X	find_mkvs(name,ppesd)
X	free_mkvi(mkv)
X	free_mkvs(mkv)
X	get_ivptr(param,ppiv)
X	get_svptr(param,ppsv)
X	mkv_proc_starting(pcb)
X	mkv_proc_terminating(pcb)
X	var_init()
X
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */
X/*:06-27-1989-21:37-wht-start on mkv */
X/*:06-24-1989-16:53-wht-flush edits --- ecu 1.95 */
X
X#include "ecu.h"
X#include "esd.h"
X#define VDECL
X#include "var.h"
X#include "proc.h"
X#include "ecukey.h"
X#include "ecuerror.h"
X
Xchar *malloc();
X
Xextern int proc_level;
X
Xtypedef union mkvu_type
X{
X	ESD	*sv;
X	long iv;
X} MKVU;
X
Xtypedef struct mkv_type
X{
X	MKVU item;				/* pointer to esd if sv or long if iv */
X	struct mkv_type *next;	/* next MKV in chain; if==NULL, no more in chain */
X	struct mkv_type *prev;	/* previous MKV in chain; if==NULL, top of chain */
X	char *name;				/* name of variable */
X} MKV;
X
XMKV *mkvi_last = (MKV *)0;
XMKV *mkvs_last = (MKV *)0;
X
X/*+-------------------------------------------------------------------------
X	var_init()
X--------------------------------------------------------------------------*/
Xvoid
Xvar_init()
X{
Xregister itmp;
X
X	for(itmp = 0; itmp < SVQUAN; itmp++)
X	{
X		if((sv[itmp] = make_esd(SVLEN)) == (ESD *)0)
X		{
X			pputs("out of memory\n");
X			exit(1);
X		}
X	}
X
X	for(itmp = 0; itmp < IVQUAN; itmp++)
X		iv[itmp] = 0;
X
X}	/* end of var_init */
X
X/*+-------------------------------------------------------------------------
X	alloc_MKV(name)
X--------------------------------------------------------------------------*/
XMKV *
Xalloc_MKV(name)
Xchar *name;
X{
XMKV *mkv;
X	if((mkv = (MKV *)malloc(sizeof(MKV))) == (MKV *)0)
X		return((MKV *)0);
X	if((mkv->name = malloc(strlen(name) + 1)) == (char *)0)
X	{
X		free((char *)mkv);
X		return((MKV *)0);
X	}
X	strcpy(mkv->name,name);
X	mkv->item.iv = 0;
X
X}	/* end of alloc_MKV */
X
X/*+-------------------------------------------------------------------------
X	build_mkvi(param)
X--------------------------------------------------------------------------*/
Xbuild_mkvi(param)
XESD *param;
X{
Xregister erc;
Xchar name[16];
XMKV *mkv;
X
X	if(erc = get_alphanum_zstr(param,name,sizeof(name)))
X		return(erc);
X
X	if((mkv = alloc_MKV(name)) == (MKV *)0)
X		return(eNoMemory);
X
X	if(mkvi_last)
X		mkvi_last->next = mkv;
X	mkv->prev = mkvi_last;
X	mkv->next = (MKV *)0;
X	mkvi_last = mkv;
X	return(0);
X
X}	/* end of build_mkvi */
X
X/*+-------------------------------------------------------------------------
X	build_mkvs(param)
X--------------------------------------------------------------------------*/
Xbuild_mkvs(param)
XESD *param;
X{
Xregister erc;
Xchar name[16];
XMKV *mkv = (MKV *)0;
XESD *text = (ESD *)0;
Xulong length;
X
X	if(erc = get_alphanum_zstr(param,name,sizeof(name)))
X		return(erc);
X
X	if(erc = skip_paren(param,1))
X		return(erc);
X	if(erc = gint(param,&length))
X		return(erc);
X	if(length > 5120)
X	{
X		pprintf("max string size is 5120 ... cannot make %lu byte string\n",
X			length);
X		return(eFATAL_ALREADY);
X	}
X	if(erc = skip_paren(param,0))
X		return(erc);
X
X	if((text = make_esd((int)length)) == (ESD *)0)
X		return(eNoMemory);
X
X	if((mkv = alloc_MKV(name)) == (MKV *)0)
X	{
X		free_esd(text);
X		return(eNoMemory);
X	}
X
X	mkv->item.sv = text;
X
X	if(mkvs_last)
X		mkvs_last->next = mkv;
X	mkv->prev = mkvs_last;
X	mkv->next = (MKV *)0;
X	mkvs_last = mkv;
X	return(0);
X
X}	/* end of build_mkvs */
X
X/*+-------------------------------------------------------------------------
X	cmd_mkvar(param)
X
Xmkvar i<name>
Xmkvar s<name>(<size-int>)
X--------------------------------------------------------------------------*/
Xint
Xcmd_mkvar(param)
XESD *param;
X{
Xregister erc;
Xchar vartype;
X
X	if(!proc_level)
X		return(eNotExecutingProc);
X
X	do {
X		if(erc = get_cmd_char(param,&vartype))
X			return(erc);
X		if(vartype == '$')
X		{
X			if(erc = get_cmd_char(param,&vartype))
X				return(erc);
X		}
X		vartype = to_lower(vartype);
X		switch(vartype)
X		{
X			case 'i':
X				erc = build_mkvi(param);
X				break;
X			case 's':
X				erc = build_mkvs(param);
X				break;
X			default:
X				return(eIllegalVarType);
X		}
X		if(erc)
X			return(erc);
X	} while(!skip_comma(param));
X
X	if(!end_of_cmd(param))
X		return(eSyntaxError);
X
X	return(0);
X
X}	/* end of cmd_mkvar */
X
X/*+-------------------------------------------------------------------------
X	free_mkvi(mkv)
X--------------------------------------------------------------------------*/
Xvoid
Xfree_mkvi(mkv)
XMKV *mkv;
X{
X	free(mkv->name);
X	free((char *)mkv);
X}	/* end of free_mkvi */
X
X/*+-------------------------------------------------------------------------
X	free_mkvs(mkv)
X--------------------------------------------------------------------------*/
Xvoid
Xfree_mkvs(mkv)
XMKV *mkv;
X{
X	free_esd(mkv->item.sv);
X	free(mkv->name);
X	free((char *)mkv);
X}	/* end of free_mkvs */
X
X/*+-------------------------------------------------------------------------
X	mkv_proc_starting(pcb)
X--------------------------------------------------------------------------*/
Xvoid
Xmkv_proc_starting(pcb)
XPCB *pcb;
X{
X	pcb->mkvs_last = (char *)mkvs_last;
X	pcb->mkvi_last = (char *)mkvi_last;
X}	/* end of mkv_proc_starting */
X
X/*+-------------------------------------------------------------------------
X	mkv_proc_terminating(pcb)
X--------------------------------------------------------------------------*/
Xvoid
Xmkv_proc_terminating(pcb)
XPCB *pcb;
X{
XMKV *pmkv;
X
X	while(mkvi_last != (MKV *)pcb->mkvi_last)
X	{
X		pmkv = mkvi_last->prev;
X		free_mkvi(mkvi_last);
X		mkvi_last = pmkv;
X	}
X	while(mkvs_last != (MKV *)pcb->mkvs_last)
X	{
X		pmkv = mkvs_last->prev;
X		free_mkvs(mkvs_last);
X		mkvs_last = pmkv;
X	}
X
X}	/* end of mkv_proc_terminating */
X
X/*+-------------------------------------------------------------------------
X	find_mkvs(name,ppesd)
X--------------------------------------------------------------------------*/
Xint
Xfind_mkvs(name,ppesd)
Xchar *name;
XESD **ppesd;
X{
XMKV *mkv = mkvs_last;
X
X	while(mkv)
X	{
X		if(!strcmp(name,mkv->name))
X		{
X			*ppesd = mkv->item.sv;
X			return(0);
X		}
X		mkv = mkv->prev;
X	}
X	return(eNoSuchVariable);
X
X}	/* end of find_mkvs */
X
X/*+-------------------------------------------------------------------------
X	find_mkvi(name,pplong)
X--------------------------------------------------------------------------*/
Xint
Xfind_mkvi(name,pplong)
Xchar *name;
Xlong **pplong;
X{
XMKV *mkv = mkvi_last;
X
X	while(mkv)
X	{
X		if(!strcmp(name,mkv->name))
X		{
X			*pplong = &mkv->item.iv;
X			return(0);
X		}
X		mkv = mkv->prev;
X	}
X	return(eNoSuchVariable);
X
X}	/* end of find_mkvi */
X
X/*+-------------------------------------------------------------------------
X	get_subscript(param,psubscript)
Xonly called when '[' at pb + index
X--------------------------------------------------------------------------*/
Xget_subscript(param,psubscript)
XESD *param;
Xulong *psubscript;
X{
Xregister erc;
X
X	param->index++;
X	if(erc = gint(param,psubscript))
X		return(erc);
X	if(skip_cmd_char(param,']'))
X		return(eSyntaxError);
X	
X}	/* end of get_subscript */
X
X/*+-------------------------------------------------------------------------
X	get_ivptr(param,ppiv)
Xcallled with index set to $i.....
X                            ^
X--------------------------------------------------------------------------*/
Xget_ivptr(param,ppiv)
XESD *param;
Xlong **ppiv;
X{
Xregister erc;
Xulong varnum;
Xchar name[16];
X
X	if(end_of_cmd(param))
X		return(eSyntaxError);
X	else if(!get_numeric_value(param,&varnum))
X		goto TEST_VARNUM;
X	else if(*(param->pb + param->index) == '[')
X	{
X		if(erc = get_subscript(param,&varnum))
X			return(erc);
XTEST_VARNUM:
X		if(varnum >= IVQUAN)
X			return(eIllegalVarNumber);
X		*ppiv = &iv[(int)varnum];
X		return(0);
X	}
X	else if(get_alphanum_zstr(param,name,sizeof(name)))
X		return(eInvalidVarName);
X
X	return(find_mkvi(name,ppiv));
X
X}	/* end of get_ivptr */
X
X/*+-------------------------------------------------------------------------
X	get_svptr(param,ppsv)
Xcallled with index set to $s.....
X                            ^
X--------------------------------------------------------------------------*/
Xget_svptr(param,ppsv)
XESD *param;
XESD **ppsv;
X{
Xregister erc;
Xulong varnum;
Xchar name[16];
X
X	if(end_of_cmd(param))
X		return(eSyntaxError);
X	else if(!get_numeric_value(param,&varnum))
X		goto TEST_VARNUM;
X	else if(*(param->pb + param->index) == '[')
X	{
X		if(erc = get_subscript(param,&varnum))
X			return(erc);
XTEST_VARNUM:
X		if(varnum >= SVQUAN)
X			return(eIllegalVarNumber);
X		*ppsv = sv[(int)varnum];
X		return(0);
X	}
X	if(get_alphanum_zstr(param,name,sizeof(name)))
X		return(eInvalidVarName);
X	return(find_mkvs(name,ppsv));
X
X}	/* end of get_svptr */
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of var.c */
SHAR_EOF
chmod 0644 var.c || echo "restore of var.c fails"
echo "x - extracting dialer.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > dialer.h &&
X/* CHK=0x8F3C */
X/*+-------------------------------------------------------------------------
X	dialer.h - HDB UUCP dialer program return code error codes
X	Copyright 1989 Warren H. Tucker, III. All Rights Reserved
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */
X/*:07-01-1989-21:56-wht-creation */
X
X#define	RC_FAIL		0x80	/* 1 = failed to connect */
X#define	RCE_NULL	0		/* general purpose or unknown error code */
X#define	RCE_INUSE	1		/* line in use */
X#define	RCE_SIG		2		/* signal aborted dialer */
X#define	RCE_ARGS	3		/* invalid arguments */
X#define	RCE_PHNO	4		/* invalid phone number */
X#define	RCE_SPEED	5		/* invalid baud rate -or- bad connect baud */
X#define	RCE_OPEN	6		/* can't open line */
X#define	RCE_IOCTL	7		/* ioctl error */
X#define	RCE_TIMOUT	8		/* timeout */
X#define	RCE_NOTONE	9		/* no dial tone */
X#define	RCE_BUSY	13		/* phone is busy */
X#define	RCE_NOCARR	14		/* no carrier */
X#define	RCE_ANSWER	15		/* no answer */
X
X/* code writing aid */
X#ifdef NEVER
X		case RCE_NULL:		/* general purpose or unknown error code */
X		case RCE_INUSE:		/* line in use */
X		case RCE_SIG:		/* signal aborted dialer */
X		case RCE_ARGS:		/* invalid arguments */
X		case RCE_PHNO:		/* invalid phone number */
X		case RCE_SPEED:		/* invalid baud rate -or- bad connect baud */
X		case RCE_OPEN:		/* can't open line */
X		case RCE_IOCTL:		/* ioctl error */
X		case RCE_TIMOUT:	/* timeout */
X		case RCE_NOTONE:	/* no dial tone */
X		case RCE_BUSY:		/* phone is busy */
X		case RCE_NOCARR:	/* no carrier */
X		case RCE_ANSWER:	/* no answer */
X#endif
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of dialer.h */
SHAR_EOF
chmod 0644 dialer.h || echo "restore of dialer.h fails"
echo "x - extracting dvent.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > dvent.h &&
X/* CHK=0x9039 */
X/*+-------------------------------------------------------------------------
X	dvent.h - HDB UUCP Devices file entry (a la pwent.h)
X	Copyright 1989 Warren H. Tucker, III. All Rights Reserved
X--------------------------------------------------------------------------*/
X/*+:EDITS:*/
X/*:07-03-1989-22:57-wht------------- ecu 2.00 ---------------- */
X/*:07-01-1989-14:50-wht-creation */
X
Xstruct dvent
X{
X	char *type;		/* ACU or Direct */
X	char *line;		/* tty  name "ttyxx"-style */
X	char *dialer;	/* "801" dialer line */
X	uint low_baud;	/* lowest baud rate */
X	uint high_baud;	/* highest baud rate */
X	char *dialprog;	/* dialer program */
X};
X
Xstruct dvent *getdvent();
Xstruct dvent *getdvbaud();
Xstruct dvent *getdvline();
Xvoid enddvent();
X
X/* vi: set tabstop=4 shiftwidth=4: */
X/* end of dvent.h */
SHAR_EOF
chmod 0644 dvent.h || echo "restore of dvent.h fails"
echo "x - extracting ecu.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > ecu.h &&
X/* CHK=0xECCF */
X/*+-----------------------------------------------------------------------
X	ecu.h -- TuckerWare Extended Calling Unit
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
X#if !defined(STDIO_H_INCLUDED)
X#include <stdio.h>
X#endif
X#include <signal.h>
X#include <ctype.h>
X#include <sys/types.h>
X#include <sys/errno.h>
X
X#include "ecuhangup.h"
X
X#define MALLOC_3X
X#if defined(MALLOC_3X)
X#include <malloc.h>
X#endif
X
X#if defined(M_XENIX)
X#include <memory.h>
X#include <sys/stat.h>
X#include <string.h>
X#include <fcntl.h>
X#if !defined(OMIT_TERMIO_REFERENCES)
X#include <sys/ioctl.h>
X#include <termio.h>
X#endif
X#endif
X
X#if defined(pyr)
X#include <sys/stat.h>
X#include <sys/file.h>
X#if !defined(OMIT_TERMIO_REFERENCES)
X#include <sys/termio.h>
X#endif
X#include <strings.h>
X#define strchr index
X#define strrchr rindex
X#define memcpy(a,b,c) bcopy(b,a,c)
X#endif
X
X#if !defined(ushort)
X#define ushort unsigned short
X#endif
X#if !defined(uchar)
X#define uchar unsigned char
X#endif
X#if !defined(uint)
X#define uint unsigned int
X#endif
X#if !defined(ulong)
X#define ulong unsigned long
X#endif
X
X/* for better source line utilization, frequent use of 'fprintf' and 'stderr'
X   warrants the following */
X#define pf	printf
X#define	ff	fprintf
X#define se	stderr
X#define so	stdout
X
X#define DEFAULT_BAUD_RATE	2400
X#define TTYIN	0
X#define TTYOUT  1				/* ditto tty output */
X#define TTYERR  2				/* ditty tty output error channel */
X
X/* xbell codes */
X#if defined(M_XENIX)
X#define  XBELL_DEEDLE		1		/* octaves */
X#define  XBELL_ATTENTION	2		/* morse .-.-.- ATTENTION */
X#define  XBELL_C			3		/* morse -.-. C */
X#define  XBELL_3T			4		/* 3 morse T's */
X#endif
X
X/* lopen() and related routines error codes */
X#define LOPEN_INVALID			-1		/* for invalid tty name */
X#define LOPEN_UNKPID			-2		/* unknown pid using line */
X#define LOPEN_LCKERR			-3		/* lock file open error */
X#define LOPEN_NODEV				-4		/* device does not exist */
X#define LOPEN_OPNFAIL			-5		/* could not open line */
X#define LOPEN_ALREADY			-6		/* line already open */
X#define LOPEN_ENABLED			-7		/* line enabled for login */
X#define LOPEN_ENABLED_IN_USE	-8		/* line in use by incoming login */
X#define LOPEN_DIALOUT_IN_USE	-9		/* line in use by another dial out */
X
X#if defined(DECLARE_LINEVARS_PUBLIC)
Xint Ladd_nl_incoming;		/* when in ksr mode, add nl to cr on receive */
Xint Ladd_nl_outgoing;		/* when in ksr mode, add nl to cr on xmit */
Xint Lfull_duplex;			/* if non-zero, full duplex else half */
Xint Liofd;					/* file descriptor for line */
Xint Lmodem_already_init;	/* true if modem already initialized */
Xint Lmodem_off_hook;		/* we try to keep accurate */
SHAR_EOF
echo "End of part 20"
echo "File ecu.h is continued in part 21"
echo "21" > 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.