#
/* send4.c */


/* This information is proprietary and is the property of Bell
   Telephone Laboratories, Incorporated.  Its reproduction or
   disclosure to others, either orally or in writing, is pro-
   hibited without written permission of Bell Laboratories. */


#define IDMOD send4

#define IDSTR "~|^`send4.c 1.5 1/15/76

#include "send.h"

struct keywd *bkw;

iniky()
{
	register int t;
	register struct keywd *pk;
	t=sbrk(12);
	ikw=pk=t;
	t=+12;
	bkw=pk->nx=t;
	pk->lk=pk->nk=pk->nr=0;
	pk->kp=pk->rp="";
};

gtky(ctx,n,s)
struct context *ctx;
char *s;
{
	register int m;
	register struct keywd *pk,*qk;
	m=n;
	qk=ctx->kw1;
	for (pk=ikw;pk<qk;pk=pk->nx)
	{
		if (pk->nk==m && mtch(m,pk->kp,s)) return (pk);
	};
	return (0);
};

gtkz(ctx,n,s)
struct context *ctx;
char *s;
{
	register int m;
	register struct keywd *pk,*qk;
	m=n;
	qk=ctx->kw1;
	for (pk=ikw;pk<qk;pk=pk->nx)
	{
		if (pk->nk==m && mtch(m,pk->kp,s))
		{
			if (pk->nr>0 || pk->rp<=0377) return (pk);
		};
	};
	return (0);
};

dfky(ctx,nks,ks,nrs,rs)
struct context *ctx;
char *ks,*rs;
{
	int tb;
	char *q,*px;
	register int t;
	register char *p;
	register struct keywd *pk;
	if ((t=nks)<=0) return;
	if (pk=gtkz(ctx,t,ks))
	{
		if (pk->nr==(t=nrs) && mtch(t,pk->rp,rs))
		{
			if (t>0 || pk->rp==rs)
			{
				if (pk>=ctx->kw0) return;
				goto CP;
			};
		};
		if (diag(ctx,"cannot redefine keyword",0,591))
		{
			p=pk->kp;
			for (t=pk->nk;t>0;t--) prc(*p++);
			prc('=');
			p=pk->rp;
			if (p<=0377)
			{
				t=p;
				prc('^');
				t=>>4; 
				t=& 017;
				prc((t<10? t+'0':t+'A'-10));
				t=p; 
				t=& 017;
				prc((t<10? t+'0':t+'A'-10));
			}
			else for (t=pk->nr;t>0;t--) prc(*p++);
			prf("\n");
		};
		return;
	};
CP: 
	t=ctx->kw1;
	t=+12;
	q=t;
	t=+nks;
	t=+nrs;
	if (t&1) t++;
	pk=t;
	if (pk>bkw)
	{
		tb=(-DBR)&(t+DBR);
		if (brk(tb)==(-1))
		{
			prf("Core exceeded. (574)\n"); 
			abt();
		};
		bkw=tb;
	};
	pk=ctx->kw1;
	ctx->kw1=t;
	pk->nx=t;
	t=ks[0];
	pk->lk=kwx[t];
	kwx[t]=pk;
	pk->nk=nks;
	pk->nr=nrs;
	pk->kp=q;
	px=(p=ks)+nks;
	while (p<px) *q++=(*p++);
	if (rs<=0377)
	{
		pk->rp=rs; 
		return;
	};
	pk->rp=q;
	px=(p=rs)+nrs;
	while (p<px) *q++=(*p++);
};

/*end*/
