* Copyright (c) 1986 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
* @(#)kdb_expr.c 7.6 (Berkeley) %G%
/* term | term dyadic expr | */
(void) kdbrdc(); kdblp
--; rc
=kdbterm(a
);
switch ((int)kdbreadchar()) {
(void) kdbterm(a
|1); kdbexpv
+= lhs
; break;
(void) kdbterm(a
|1); kdbexpv
= lhs
- kdbexpv
; break;
(void) kdbterm(a
|1); kdbexpv
= kdbround(lhs
,kdbexpv
); break;
(void) kdbterm(a
|1); kdbexpv
*= lhs
; break;
(void) kdbterm(a
|1); kdbexpv
= lhs
/kdbexpv
; break;
(void) kdbterm(a
|1); kdbexpv
&= lhs
; break;
(void) kdbterm(a
|1); kdbexpv
|= lhs
; break;
/* item | monadic item | (expr) | */
switch ((int)kdbreadchar()) {
(void) kdbterm(a
|1); kdbexpv
=kdbchkget(kdbexpv
,DSP
);
(void) kdbterm(a
|1); kdbexpv
=kdbchkget(kdbexpv
,ISP
);
(void) kdbterm(a
|1); kdbexpv
= -kdbexpv
;
(void) kdbterm(a
|1); kdbexpv
= ~kdbexpv
;
(void) kdbterm(a
|1); kdbexpv
= !kdbexpv
;
/* name [ . local ] | number | . | ^ | <var | <register | 'x | | */
register base
, d
, regptr
;
register struct nlist
*symp
;
frame
= kdbpcb
.pcb_fp
; kdblastframe
= 0;
kdbcallpc
= kdbpcb
.pcb_pc
;
(void) kdbfindsym((long)kdbcallpc
,ISYM
);
if (kdbeqsym(kdbcursym
->n_un
.n_name
,kdbisymbol
,'~'))
kdbcallpc
= getprevpc(frame
);
frame
= getprevframe(frame
);
kdbsavlastf
= kdblastframe
; kdbsavframe
= frame
;
kdbchkloc(kdbexpv
=frame
);
} else if ((symp
=kdblookup(kdbisymbol
))==0)
kdblastframe
=kdbsavlastf
; kdbcallpc
=kdbsavpc
;
kdbchkloc((long)kdbsavframe
);
kdbexpv
=kdbinkdot(kdbdotinc
);
kdbexpv
=kdbinkdot(-kdbdotinc
);
if ((regptr
=kdbgetreg(savc
)) != -1)
kdbexpv
= *(int *)regptr
;
else if ((base
=kdbvarchk(savc
)) != -1)
/* service routines for expression reading */
if ((base
= kdbradix
) < 0)
while (base
>10 ? isxdigit(kdblastc
) : isdigit(kdblastc
)) {
register m
= MAXINT
/base
;
if (kdbexpv
>m
) /* avoid overflow */
kdbexpv
= (kdbexpv
-m
)*base
+m
*base
;
if ((d
=kdbconvdig(kdblastc
))>=base
|| d
<0)
kdbexpv
+= d
; (void) kdbreadchar();
if (kdblastc
=='x' || kdblastc
=='X') {
base
=16; (void) kdbreadchar();
} else if (kdblastc
=='t' || kdblastc
=='T') {
base
=10; (void) kdbreadchar();
} else if (kdblastc
=='o' || kdblastc
=='O') {
base
=8; (void) kdbreadchar();
if (kdblastc
=='.' && (base
==10 || kdbexpv
==0)) {
while (isdigit(kdbreadchar())) {
if (p
< &kdbisymbol
[sizeof(kdbisymbol
)-1])
return (isalpha(kdblastc
) || kdblastc
=='_' || dig
&& isdigit(kdblastc
));
return ((name
&037)-1+10);
if (kdblocalsym(frame
)==0)
} while (!kdbeqsym(kdbcursym
->n_un
.n_name
,kdbisymbol
,'~'));
if (*s1
== c
&& kdbstreq(s1
+1, s2
))