struct varblock
*subscript(v
,s
)
if(v
->tag
!=TNAME
&& v
->tag
!=TTEMP
)
badtag("subscript", v
->tag
);
badtag("subscript", s
->tag
);
sizalign(v
, &size
, &align
, &mask
);
p
= mknode(TAROP
,OPMINUS
,mkint(1),cpexpr(bounds
->lowerb
));
subs
->datap
= mknode(TAROP
,OPPLUS
, subs
->datap
, p
);
exprerr("subscript and bounds of different length", CNULL
);
{ /* special case of subscripted type element */
if(s
->leftp
==0 || s
->leftp
->nextp
!=0)
exprerr("not exactly one subscript on type member", CNULL
);
q
= mknode(TAROP
,OPMINUS
,s
->leftp
->datap
, mkint(1) );
q
= mknode(TAROP
,OPSTAR
, mkint(size
), q
);
v
->voffset
= mknode(TAROP
,OPPLUS
,v
->voffset
, q
);
if(v
->vtype
==TYCHAR
|| v
->vtype
==TYSTRUCT
||
(v
->vtype
==TYLCOMPLEX
&& tailor
.lngcxtype
==NULL
) )
{ /* add an initial unit subscript */
s
->leftp
= mkchain(mkint(1), s
->leftp
);
else { /* add to offset, set first subscript to 1 */
q
= mknode(TAROP
,OPMINUS
,s
->leftp
->datap
, mkint(1) );
q
= mknode(TAROP
,OPSTAR
, mkint(size
), q
);
v
->voffset
= mknode(TAROP
,OPPLUS
,v
->voffset
, q
);
s
->leftp
->datap
= mkint(1);
ptr
strucelt(var
, subelt
)
if(var
->vtype
!=TYSTRUCT
|| var
->vtypep
==0 || var
->vdim
!=0)
exprerr("attempt to find a member in an array or non-structure", CNULL
);
for(p
= var
->vtypep
->strdesc
; p
; p
= p
->nextp
)
if(subelt
== p
->datap
->sthead
) break;
exprerr("%s is not in structure\n", subelt
->namep
);
var
->voffset
= mknode(TAROP
,OPPLUS
,var
->voffset
,cpexpr(q
->voffset
));
var
->voffset
= cpexpr(q
->voffset
);
if( (var
->vtype
= q
->vtype
) != TYSTRUCT
)
fatal("convtype: impossible type");
for(i
=0; i
<NFTNTYPES
; ++i
)
if(i
!= k
) p
->vbase
[i
] = 0;
exprerr("illegal combination of array and dot",CNULL
);
firstsub
= &(p
->vsubs
->leftp
->datap
);
sizalign(p
, &size
,&align
,&mask
);
size
= tailor
.ftnsize
[FTNINT
];
q
= mknode(TAROP
,OPSLASH
,p
->voffset
,mkint(size
));
*firstsub
= mknode(TAROP
,OPPLUS
, q
, *firstsub
);