* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley Software License Agreement
* specifies the terms and conditions for redistribution.
static char *sccsid
= "@(#)set.c 5.2 (Berkeley) %G%";
for (vp
= p
; alnum(*p
); p
++)
if (vp
== p
|| !letter(*vp
))
if (*p
== 0 && *v
&& **v
== '(')
} else if (*v
&& eq(*v
, "=")) {
asx(vp
, subscr
, savestr(p
));
exportpath(adrof("path")->vec
);
} else if (eq(vp
, "histchars")) {
register char *p
= value("histchars");
} else if (eq(vp
, "user"))
setenv("USER", value(vp
));
setenv("TERM", value(vp
));
setenv("HOME", value(vp
));
else if (eq(vp
, "filec"))
while (*cp
&& digit(*cp
))
*ip
= *ip
* 10 + *cp
++ - '0';
bferr("Subscript error");
register struct varent
*v
= getvx(vp
, subscr
);
xfree(v
->vec
[subscr
- 1]);
v
->vec
[subscr
- 1] = globone(p
);
register struct varent
*v
= adrof(vp
);
if (subscr
< 1 || subscr
> blklen(v
->vec
))
bferr("Subscript out of range");
char plusplus
[2] = { '1', 0 };
for (vp
= p
; alnum(*p
); p
++)
if (vp
== p
|| !letter(*vp
))
/* avoid bug in vax CC */
struct varent
*gv
= getvx(vp
, subscr
);
asx(vp
, subscr
, operate(op
, gv
->vec
[subscr
- 1], p
));
asx(vp
, subscr
, operate(op
, getvx(vp
, subscr
)->vec
[subscr
- 1], p
));
set(vp
, operate(op
, value(vp
), p
));
exportpath(adrof("path")->vec
);
if (op
== '<' || op
== '>')
bferr("Expression syntax");
if (sizeof (int) == 2 && n
== -32768) {
} else if (sizeof (int) == 4 && n
== -2147483648) {
return (savestr(number
));
if (cp
[0] == '+' && cp
[1])
n
= n
* 10 + *cp
++ - '0';
bferr("Badly formed number");
register struct varent
*vp
;
return (vp
== 0 || vp
->vec
[0] == 0 ? "" : vp
->vec
[0]);
register struct varent
*vp
;
register struct varent
*vp1
;
for (; vp
; vp
= vp
->v_right
) {
if (vp
->v_left
&& (vp1
= madrof(pat
, vp
->v_left
)))
if (Gmatch(vp
->v_name
, pat
))
register struct varent
*v
;
while (v
&& ((cmp
= *name
- *v
->v_name
) ||
(cmp
= strcmp(name
, v
->v_name
))))
* The caller is responsible for putting value in a safe place
register char **vec
= (char **) xalloc(2 * sizeof (char **));
vec
[0] = onlyread(val
) ? savestr(val
) : val
;
register char **oldv
= vec
;
register struct varent
*p
;
register struct varent
*c
;
f
= 0; /* tree hangs off the header's left link */
while (c
= p
->v_link
[f
]) {
if ((f
= *name
- *c
->v_name
) == 0 &&
(f
= strcmp(name
, c
->v_name
)) == 0) {
p
->v_link
[f
] = c
= (struct varent
*)xalloc(sizeof (struct varent
));
c
->v_name
= savestr(name
);
c
->v_left
= c
->v_right
= 0;
if (adrof("histchars") == 0) {
register struct varent
*vp
;
while (vp
= madrof(*v
, head
->v_left
))
register struct varent
*vp
;
if ((vp
= adrof1(var
, &shvhed
)) == 0)
register struct varent
*p
;
register struct varent
*c
, *pp
;
* Free associated memory first to avoid complications.
* If p is missing one child, then we can move the other
* into where p is. Otherwise, we find the predecessor
* of p, which is guaranteed to have no right child, copy
* it into p, and move it's left child into it.
for (c
= p
->v_left
; c
->v_right
; c
= c
->v_right
)
* Move c into where p is.
* Free the deleted node, and rebalance.
register struct varent
*argv
;
if (strlen(*val
) + strlen(exppath
) + 2 > BUFSIZ
) {
printf("Warning: ridiculously long PATH truncated\n");
(void) strcat(exppath
, *val
++);
if (*val
== 0 || eq(*val
, ")"))
(void) strcat(exppath
, ":");
/* macros to do single rotations on node p */
(t)->v_parent = (p)->v_parent,\
((p)->v_left = t->v_right) ? (t->v_right->v_parent = (p)) : 0,\
(t->v_right = (p))->v_parent = t,\
(t)->v_parent = (p)->v_parent,\
((p)->v_right = t->v_left) ? (t->v_left->v_parent = (p)) : 0,\
(t->v_left = (p))->v_parent = t,\
* Rebalance a tree, starting at p and up.
* F == 0 means we've come from p's left child.
* D == 1 means we've just done a delete, otherwise an insert.
register struct varent
*p
;
register struct varent
*pp
;
register struct varent
*t
; /* used by the rotate macros */
* Ok, from here on, p is the node we're operating on;
* pp is it's parent; f is the branch of p from which we have come;
* ff is the branch of pp which is p.
for (; pp
= p
->v_parent
; p
= pp
, f
= ff
) {
if (f
^ d
) { /* right heavy */
case -1: /* was left heavy */
case 0: /* was balanced */
case 1: /* was already right heavy */
switch (p
->v_right
->v_bal
) {
case 1: /* sigle rotate */
pp
->v_link
[ff
] = rleft(p
);
case 0: /* single rotate */
pp
->v_link
[ff
] = rleft(p
);
case -1: /* double rotate */
pp
->v_link
[ff
] = rleft(p
);
} else { /* left heavy */
case 1: /* was right heavy */
case 0: /* was balanced */
case -1: /* was already left heavy */
switch (p
->v_left
->v_bal
) {
case -1: /* single rotate */
pp
->v_link
[ff
] = rright(p
);
case 0: /* signle rotate */
pp
->v_link
[ff
] = rright(p
);
case 1: /* double rotate */
pp
->v_link
[ff
] = rright(p
);
* If from insert, then we terminate when p is balanced.
* If from delete, then we terminate when p is unbalanced.
register struct varent
*p
;
register struct varent
*c
;
(void) sigsetmask(sigblock(0) & ~ sigmask(SIGINT
));
if (p
->v_parent
== 0) /* is it the header? */
} while (p
->v_right
== c
);