/* ROUTINES CALLED DURING DATA STATEMENT PROCESSING */
static char datafmt
[] = "%s\t%05ld\t%05ld\t%d" ;
/* another initializer, called from parser */
register expptr repp
, valp
;
else if (ISICON(repp
) && repp
->constblock
.const.ci
>= 0)
nrep
= repp
->constblock
.const.ci
;
err("invalid repetition count in DATA statement");
err("non-constant initializer");
if(toomanyinit
) goto ret
;
for(i
= 0 ; i
< nrep
; ++i
)
p
= nextdata(&elen
, &vlen
);
err("too many initializers");
setdata(p
, valp
, elen
, vlen
);
Addrp
nextdata(elenp
, vlenp
)
register struct Impldoblock
*ip
;
register struct Rplblock
*rp
;
if(ip
->implb
==NULL
|| ip
->impub
==NULL
|| ip
->varnp
==NULL
)
fatali("bad impldoblock 0%o", (int) ip
);
ip
->varvp
->const.ci
+= ip
->impdiff
;
q
= fixtype(cpexpr(ip
->implb
));
q
= fixtype(cpexpr(ip
->impstep
));
ip
->impdiff
= q
->constblock
.const.ci
;
q
= fixtype(cpexpr(ip
->impub
));
ip
->implim
= q
->constblock
.const.ci
;
rp
->rplvp
= (expptr
) (ip
->varvp
);
if( (ip
->impdiff
>0 && (ip
->varvp
->const.ci
<= ip
->implim
))
|| (ip
->impdiff
<0 && (ip
->varvp
->const.ci
>= ip
->implim
)) )
rpllist
= rpllist
->rplnextp
;
pp
= (struct Primblock
*) p
;
if(p
->primblock
.argsp
==NULL
&& np
->vdim
!=NULL
)
{ /* array initialization */
off
= typesize
[np
->vtype
] * curdtelt
;
off
*= np
->vleng
->constblock
.const.ci
;
mkexpr(OPPLUS
, q
->addrblock
.memoffset
, mkintcon(off
) );
if( (neltp
= np
->vdim
->nelt
) && ISCONST(neltp
))
if(++curdtelt
< neltp
->constblock
.const.ci
)
err("attempt to initialize adjustable array");
if(q
->headblock
.vtype
== TYCHAR
)
if(ISICON(q
->headblock
.vleng
))
*elenp
= q
->headblock
.vleng
->constblock
.const.ci
;
err("initialization of string of nonconstant length");
else *elenp
= typesize
[q
->headblock
.vtype
];
if(np
->vstg
== STGCOMMON
)
*vlenp
= extsymtab
[np
->vardesc
.varno
].maxleng
;
else if(np
->vstg
== STGEQUIV
)
*vlenp
= eqvclass
[np
->vardesc
.varno
].eqvleng
;
*vlenp
= (np
->vtype
==TYCHAR
?
np
->vleng
->constblock
.const.ci
:
if(np
->vstg
==STGBSS
&& *vlenp
>0)
*vlenp
*= np
->vdim
->nelt
->constblock
.const.ci
;
err("nonconstant implied DO parameter");
setdata(varp
, valp
, elen
, vlen
)
char *dataname(), *varname
;
varname
= dataname(varp
->vstg
, varp
->memno
);
offset
= varp
->memoffset
->constblock
.const.ci
;
if(type
!=TYCHAR
&& valtype
==TYCHAR
)
warn("non-character datum initialized with character string");
varp
->vleng
= ICON(typesize
[type
]);
varp
->vtype
= type
= TYCHAR
;
else if( (type
==TYCHAR
&& valtype
!=TYCHAR
) ||
(cktype(OPASSIGN
,type
,valtype
) == TYERROR
) )
err("incompatible types in initialization");
else consconv(type
, &con
, valtype
, &valp
->const);
dataline(varname
, offset
, vlen
, type
);
prconi(initfile
, type
, con
.ci
);
dataline(varname
, offset
, vlen
, type
);
prcona(initfile
, con
.ci
);
dataline(varname
, offset
, vlen
, type
);
prconr(initfile
, type
, con
.cd
[i
]);
offset
+= typesize
[type
];
k
= valp
->vleng
->constblock
.const.ci
;
dataline(varname
, offset
++, vlen
, TYCHAR
);
fprintf(initfile
, "\t%d\n",
k
= elen
- valp
->vleng
->constblock
.const.ci
;
dataline(varname
, offset
, vlen
, TYBLANK
);
fprintf(initfile
, "\t%d\n", k
);
badtype("setdata", type
);
output form of name is padded with blanks and preceded
with a storage class digit
char *dataname(stg
,memno
)
static char varname
[XL
+2];
varname
[0] = (stg
==STGCOMMON
? '2' : (stg
==STGEQUIV
? '1' : '0') );
for(t
= varname
+1 ; *s
; )
register struct Chain
*p
;
for(p
= p0
; p
; p
= p
->nextp
)
if(q
->impldoblock
.isbusy
)
return; /* circular chain completed */
q
->impldoblock
.isbusy
= YES
;
frdata(q
->impldoblock
.datalist
);
dataline(varname
, offset
, vlen
, type
)
fprintf(initfile
, datafmt
, varname
, offset
, vlen
, type
);