# include # include # include SCCSID(@(#)setkey.c 8.1 12/31/84) /* ** Clearkeys - reset all key indicators in descriptor ** ** Clearkeys is used to clear the key supplied ** flags before calls to setkey */ clearkeys(d) register DESC *d; { register int i; for (i = 0; i <= d->reldum.relatts; i++) d->relgiven[i] = 0; return (0); } /* ** SETKEY - indicate a partial key for find ** ** Setkey is used to set a key value into place ** in a key. The key can be as large as the entire ** tuple. Setkey moves the key value into the ** proper place in the key and marks the value as ** supplied ** ** If the value is a null pointer, then the key is ** cleared. ** ** Clearkeys should be called once before the ** first call to setkey. */ setkey(d, key, value, dom) register DESC *d; char *key; char *value; register int dom; { register int len; char *cp; # ifdef xATR1 if (tTf(22, 8)) printf("setkey: %.14s, %d\n", d->reldum.relid, dom); # endif /* check validity of domain number */ if (dom < 1 || dom > d->reldum.relatts) syserr("setkey:rel=%12s,dom=%d", d->reldum.relid, dom); /* if value is null, clear key */ if (value == 0) { d->relgiven[dom] = 0; return; } /* mark as given */ d->relgiven[dom] = 1; len = d->relfrml[dom] & I1MASK; cp = &key[d->reloff[dom]]; if (d->relfrmt[dom] == CHAR) { pmove(value, cp, len, ' '); } else { bmove(value, cp, len); } }