/* RPCUtilsImpl.c*/
/* Last modified by D. Swinehart, November 11, 1982 10:26 am
L. Stewart, December 27, 1982 3:16 PM, flush nested declarations
L. Stewart, January 1, 1983 4:18 PM, flush AllocZero
L. Stewart, March 6, 1983 4:16 PM, flush Alloc
*/
#include <Env.h>
#include <Ec.h>
#include <rpc.h>
#include <signal.h>
#include <Context.h>
#include <Queue.h>
#include <Lark.h>
#include <Pup.h>
/* Imports */
/* From RPCPktIO*/
extern int NewPSB();
/* From Numerical package */
extern int Min();
extern int lc();
/* From Context and Queue Packages*/
extern struct RPCCtx *CurrentContext();
extern int *Enqueue();
extern struct RPCCtx *InitNContext();
/* From OS*/
extern int *GetFixed();
extern int CallSwat();
extern int MoveBlock();
extern int Zero();
extern int DoubleDiff();
struct HostNet {
char net;
char host;
};
union Machine {
int w;
struct HostNet b;
};
struct Calendar {
int time[2];
int zoneInfo;
int dstStartDay;
int dstEndDay;
int base[2]; /* last ms timer, for updating time */
};
static struct Calendar calendar;
int /*bool allFit*/
AppendString(tO, fRom)
struct ShortSTRING *tO, *fRom;
{ /* RETURNS[allFit: BOOLEAN]*/
int i, toLen, totLen, fromLen;
toLen = tO->length;
totLen = Min(tO->maxLength, toLen+fRom->length);
fromLen = totLen-toLen;
for (i=0; i<fromLen; ++i) tO->text[i+toLen] = fRom->text[i];
tO->length = totLen;
return(fromLen == fRom->length);
};
int /*bool*/
EquivalentStrings(a,b)
struct ShortSTRING *a, *b;
{
int i;
if (a->length != b->length) return(false);
for (i=0; i<a->length; ++i)
if (lc(a->text[i]) != lc(b->text[i])) return(false);
return(true);
};
struct ShortSTRING
*CStringToString(b)
char b[];
{
int len, i;
struct ShortSTRING *s;
len = strlen(b);
s = (struct ShortSTRING *) GetFixed(StringSizeN(len));
s->length = s->maxLength = len;
for (i = 0; i<len; ++i) s->text[i] = b[i];
return(s);
};
static int strlen(b)
char b[];
{
int i;
for (i = 0; i<100; ++i) if (b[i] == 0) return (i);
return (100);
};
int
InstanceToMachine(instance)
struct ShortSTRING *instance;
{ /* parses fixed-form net address*/
/* Input MUST be in the form net#host#*/
int i, net;
i=0;
net=Num(instance, &i);
return((Num(instance, &i)<<8) + net);
};
static int
Num(s, lvChar)
struct ShortSTRING *s;
int *lvChar;
{
int res, i;
char c;
res=0;
for (i=*lvChar; i<s->length; ++i) {
c = s->text[i];
if (c == '#') {
*lvChar=i+1;
return(res);
};
if ('0' > c || c > '7') break;
res = (res<<3) + c - '0';
if (res > 0377) break;
};
SIGNAL(ERROR, 0);
};
int StringSize(s)
struct ShortSTRING *s;
{
return(lenShortSTRING+(s->length+1)/2);
};
int StringSizeN(n)
int n;
{
return(lenShortSTRING+(n+1)/2);
};
int *GetSigVec()
{
struct RPCCtx *CtxRunning;
CtxRunning = CurrentContext();
return(CtxRunning->user.sigVec);
};
StartNProcess(name, ctxQ, proc, len, sigVecLen)
char *name;
struct Queue *ctxQ;
int *proc, len, sigVecLen;
{
int cBase;
struct RPCCtx *context;
cBase = (int) GetFixed(len);
len = len - (sigVecLen + lenRPCCtx + 3); /* 3 for slop */
context = InitNContext(name, cBase, len, proc);
context->user.myPSB = NewPSB(context);
SigInit(context->user.sigVec, sigVecLen, &GetSigVec);
Enqueue(ctxQ, context);
};
/* Move string to dest, or to newly allocated block (dest=0).
If how is marshall, convert to, else from, big-endian lengths.
In result, maxLength == length.
return dest */
struct ShortSTRING
/*[Un]Mar*/ *ShallString(dest, src, how)
struct ShortSTRING *dest, *src;
int how;
{
/* how is:
0 -> copy string, little-endian format
1 -> marshall string to big-endian format
2 -> unmarshall string from big-endian format
3 -> copy string, big-endian format */
int ln;
if (src==0) return 0;
ln = src->length;
if ((how&2)!=0) ln = swab(ln); /* source is big-endian */
ln = (ln+5)/2; /* now word count */
if (dest == 0) dest = (struct ShortSTRING *) GetFixed(ln);
MoveBlock(dest, src, ln);
switch (how) {
case 1: case 2:
dest->length = swab(dest->length);
default: {};
};
dest->maxLength = dest->length;
Block();
return (dest);
};
#define maxV 077777
#define minV 0100001
/* Return px-py, clipped to about 16 bits */
int DoubleComp(px, py)
int px[], py[];
{
int pt0, pt[2];
Move2(pt, px);
pt0 = DoubleDiff(pt, py);
if (pt[1]==0) {
if (pt0>=0) return (pt0);
return (maxV);
};
if (pt[1]==-1) {
if (pt0<0) return (pt0);
return (minV);
};
if (pt[1]>0) return (maxV);
/* if (pt[1]<-1) */ return (minV);
};