Doxygen Source Code Documentation
data.c File Reference
#include "defs.h"Go to the source code of this file.
Functions | |
| void | dataval (register expptr repp, register expptr valp) |
| Addrp | nextdata (ftnint *elenp) |
| void | setdata (register Addrp varp, register Constp valp, ftnint elen) |
| char * | dataname (int stg, long memno) |
| void | frdata (chainp p0) |
| void | dataline (char *varname, ftnint offset, int type) |
| void | make_param (register struct Paramblock *p, expptr e) |
Variables | |
| char | datafmt [] = "%s\t%09ld\t%d" |
| char * | cur_varname |
| LOCAL FILEP | dfile |
Function Documentation
|
||||||||||||||||
|
Definition at line 437 of file data.c. References datafmt, dfile, and offset. Referenced by setdata().
|
|
||||||||||||
|
Definition at line 376 of file data.c. References memname(), STGCOMMON, and STGEQUIV. Referenced by setdata().
00378 {
00379 static char varname[64];
00380 register char *s, *t;
00381 char buf[16];
00382
00383 if (stg == STGCOMMON) {
00384 varname[0] = '2';
00385 sprintf(s = buf, "Q.%ld", memno);
00386 }
00387 else {
00388 varname[0] = stg==STGEQUIV ? '1' : '0';
00389 s = memname(stg, memno);
00390 }
00391 t = varname + 1;
00392 while(*t++ = *s++);
00393 *t = 0;
00394 return(varname);
00395 }
|
|
||||||||||||
|
Definition at line 38 of file data.c. References Expression::addrblock, err, frexpr(), i, INDATA, ISCONST, ISICON, Addrblock::memoffset, nextdata(), p, setdata(), TADDR, Expression::tag, TCONST, UNAM_CONST, Addrblock::uname_tag, and YES. Referenced by yyparse().
00040 {
00041 int i, nrep;
00042 ftnint elen;
00043 register Addrp p;
00044
00045 if (parstate < INDATA) {
00046 frexpr(repp);
00047 goto ret;
00048 }
00049 if(repp == NULL)
00050 nrep = 1;
00051 else if (ISICON(repp) && repp->constblock.Const.ci >= 0)
00052 nrep = repp->constblock.Const.ci;
00053 else
00054 {
00055 err("invalid repetition count in DATA statement");
00056 frexpr(repp);
00057 goto ret;
00058 }
00059 frexpr(repp);
00060
00061 if( ! ISCONST(valp) ) {
00062 if (valp->tag == TADDR
00063 && valp->addrblock.uname_tag == UNAM_CONST) {
00064 /* kludge */
00065 frexpr(valp->addrblock.memoffset);
00066 valp->tag = TCONST;
00067 }
00068 else {
00069 err("non-constant initializer");
00070 goto ret;
00071 }
00072 }
00073
00074 if(toomanyinit) goto ret;
00075 for(i = 0 ; i < nrep ; ++i)
00076 {
00077 p = nextdata(&elen);
00078 if(p == NULL)
00079 {
00080 if (lineno != err_lineno)
00081 err("too many initializers");
00082 toomanyinit = YES;
00083 goto ret;
00084 }
00085 setdata((Addrp)p, (Constp)valp, elen);
00086 frexpr((expptr)p);
00087 }
00088
00089 ret:
00090 frexpr(valp);
00091 }
|
|
|
Definition at line 405 of file data.c. References charptr, Chain::datap, frchain(), free, frexpr(), Chain::nextp, q, TIMPLDO, and YES. Referenced by yyparse().
00407 {
00408 register struct Chain *p;
00409 register tagptr q;
00410
00411 for(p = p0 ; p ; p = p->nextp)
00412 {
00413 q = (tagptr)p->datap;
00414 if(q->tag == TIMPLDO)
00415 {
00416 if(q->impldoblock.isbusy)
00417 return; /* circular chain completed */
00418 q->impldoblock.isbusy = YES;
00419 frdata(q->impldoblock.datalist);
00420 free( (charptr) q);
00421 }
00422 else
00423 frexpr(q);
00424 }
00425
00426 frchain( &p0);
00427 }
|
|
||||||||||||
|
Definition at line 449 of file data.c. References Expression::addrblock, Constant::ccp1, Constant::ci, CLPARAM, Constblock::Const, Expression::constblock, errstr(), fixexpr(), fixtype(), frexpr(), Paramblock::fvarname, ICON, impldcl(), ISCONST, mkconst(), mkconv(), Paramblock::paramval, putx(), q, STGARG, TADDR, Expression::tag, TEXPR, UNAM_CONST, Addrblock::uname_tag, Addrblock::user, Paramblock::vclass, Paramblock::vleng, Addrblock::vleng, Constblock::vleng, Paramblock::vstg, Constblock::vtype, and Paramblock::vtype. Referenced by yyparse().
00451 {
00452 register expptr q;
00453 Constp qc;
00454
00455 if (p->vstg == STGARG)
00456 errstr("Dummy argument %.50s appears in a parameter statement.",
00457 p->fvarname);
00458 p->vclass = CLPARAM;
00459 impldcl((Namep)p);
00460 if (e->headblock.vtype != TYCHAR)
00461 e = putx(fixtype(e));
00462 p->paramval = q = mkconv(p->vtype, e);
00463 if (p->vtype == TYCHAR) {
00464 if (q->tag == TEXPR)
00465 p->paramval = q = fixexpr((Exprp)q);
00466 if (q->tag == TADDR && q->addrblock.uname_tag == UNAM_CONST) {
00467 qc = mkconst(TYCHAR);
00468 qc->Const = q->addrblock.user.Const;
00469 qc->vleng = q->addrblock.vleng;
00470 q->addrblock.vleng = 0;
00471 frexpr(q);
00472 p->paramval = q = (expptr)qc;
00473 }
00474 if (!ISCONST(q) || q->constblock.vtype != TYCHAR) {
00475 errstr("invalid value for character parameter %s",
00476 p->fvarname);
00477 return;
00478 }
00479 if (!(e = p->vleng))
00480 p->vleng = ICON(q->constblock.vleng->constblock.Const.ci
00481 + q->constblock.Const.ccp1.blanks);
00482 else if (q->constblock.vleng->constblock.Const.ci
00483 > e->constblock.Const.ci) {
00484 q->constblock.vleng->constblock.Const.ci
00485 = e->constblock.Const.ci;
00486 q->constblock.Const.ccp1.blanks = 0;
00487 }
00488 else
00489 q->constblock.Const.ccp1.blanks
00490 = e->constblock.Const.ci
00491 - q->constblock.vleng->constblock.Const.ci;
00492 }
00493 }
|
|
|
Definition at line 99 of file data.c. References Expression::addrblock, ALLOC, Primblock::argsp, charptr, Constant::ci, Constblock::Const, Expression::constblock, cpexpr(), cur_varname, Impldoblock::datalist, err, Fatal(), fatali(), fixtype(), free, frexpr(), Expression::headblock, Impldoblock::impdiff, Impldoblock::implb, Impldoblock::implim, Impldoblock::impstep, Impldoblock::impub, Impldoblock::isactive, ISCONST, ISICON, Addrblock::memoffset, mkaddr(), mkexpr(), mkintcon(), mklhs(), Primblock::namep, NO, OPPLUS, p, q, Rplblock::rplnextp, Rplblock::rplnp, Rplblock::rpltag, Rplblock::rplvp, skip, STGBSS, STGINIT, TCONST, TIMPLDO, Impldoblock::varnp, Impldoblock::varvp, Headblock::vleng, Headblock::vtype, and YES. Referenced by dataval(), and yyparse().
00101 {
00102 register struct Impldoblock *ip;
00103 struct Primblock *pp;
00104 register Namep np;
00105 register struct Rplblock *rp;
00106 tagptr p;
00107 expptr neltp;
00108 register expptr q;
00109 int skip;
00110 ftnint off, vlen;
00111
00112 while(curdtp)
00113 {
00114 p = (tagptr)curdtp->datap;
00115 if(p->tag == TIMPLDO)
00116 {
00117 ip = &(p->impldoblock);
00118 if(ip->implb==NULL || ip->impub==NULL || ip->varnp==NULL)
00119 fatali("bad impldoblock 0%o", (int) ip);
00120 if(ip->isactive)
00121 ip->varvp->Const.ci += ip->impdiff;
00122 else
00123 {
00124 q = fixtype(cpexpr(ip->implb));
00125 if( ! ISICON(q) )
00126 goto doerr;
00127 ip->varvp = (Constp) q;
00128
00129 if(ip->impstep)
00130 {
00131 q = fixtype(cpexpr(ip->impstep));
00132 if( ! ISICON(q) )
00133 goto doerr;
00134 ip->impdiff = q->constblock.Const.ci;
00135 frexpr(q);
00136 }
00137 else
00138 ip->impdiff = 1;
00139
00140 q = fixtype(cpexpr(ip->impub));
00141 if(! ISICON(q))
00142 goto doerr;
00143 ip->implim = q->constblock.Const.ci;
00144 frexpr(q);
00145
00146 ip->isactive = YES;
00147 rp = ALLOC(Rplblock);
00148 rp->rplnextp = rpllist;
00149 rpllist = rp;
00150 rp->rplnp = ip->varnp;
00151 rp->rplvp = (expptr) (ip->varvp);
00152 rp->rpltag = TCONST;
00153 }
00154
00155 if( (ip->impdiff>0 && (ip->varvp->Const.ci <= ip->implim))
00156 || (ip->impdiff<0 && (ip->varvp->Const.ci >= ip->implim)) )
00157 { /* start new loop */
00158 curdtp = ip->datalist;
00159 goto next;
00160 }
00161
00162 /* clean up loop */
00163
00164 if(rpllist)
00165 {
00166 rp = rpllist;
00167 rpllist = rpllist->rplnextp;
00168 free( (charptr) rp);
00169 }
00170 else
00171 Fatal("rpllist empty");
00172
00173 frexpr((expptr)ip->varvp);
00174 ip->isactive = NO;
00175 curdtp = curdtp->nextp;
00176 goto next;
00177 }
00178
00179 pp = (struct Primblock *) p;
00180 np = pp->namep;
00181 cur_varname = np->fvarname;
00182 skip = YES;
00183
00184 if(p->primblock.argsp==NULL && np->vdim!=NULL)
00185 { /* array initialization */
00186 q = (expptr) mkaddr(np);
00187 off = typesize[np->vtype] * curdtelt;
00188 if(np->vtype == TYCHAR)
00189 off *= np->vleng->constblock.Const.ci;
00190 q->addrblock.memoffset =
00191 mkexpr(OPPLUS, q->addrblock.memoffset, mkintcon(off) );
00192 if( (neltp = np->vdim->nelt) && ISCONST(neltp))
00193 {
00194 if(++curdtelt < neltp->constblock.Const.ci)
00195 skip = NO;
00196 }
00197 else
00198 err("attempt to initialize adjustable array");
00199 }
00200 else
00201 q = mklhs((struct Primblock *)cpexpr((expptr)pp), 0);
00202 if(skip)
00203 {
00204 curdtp = curdtp->nextp;
00205 curdtelt = 0;
00206 }
00207 if(q->headblock.vtype == TYCHAR)
00208 if(ISICON(q->headblock.vleng))
00209 *elenp = q->headblock.vleng->constblock.Const.ci;
00210 else {
00211 err("initialization of string of nonconstant length");
00212 continue;
00213 }
00214 else *elenp = typesize[q->headblock.vtype];
00215
00216 if (np->vstg == STGBSS) {
00217 vlen = np->vtype==TYCHAR
00218 ? np->vleng->constblock.Const.ci
00219 : typesize[np->vtype];
00220 if(vlen > 0)
00221 np->vstg = STGINIT;
00222 }
00223 return( (Addrp) q );
00224
00225 doerr:
00226 err("nonconstant implied DO parameter");
00227 frexpr(q);
00228 curdtp = curdtp->nextp;
00229
00230 next:
00231 curdtelt = 0;
00232 }
00233
00234 return(NULL);
00235 }
|
|
||||||||||||||||
|
Definition at line 248 of file data.c. References badtype(), Constant::ci, cktype(), CLBLOCK, consconv(), Constblock::Const, Expression::constblock, cur_varname, dataline(), dataname(), dfile, err, i, ICON, offset, OPASSIGN, opf(), prcona(), prconi(), prconr(), STGCOMMON, TYBLANK, TYERROR, TYQUAD, UNAM_NAME, Constblock::vleng, Constblock::vtype, and warn1(). Referenced by dataval().
00250 {
00251 struct Constblock con;
00252 register int type;
00253 int i, k, valtype;
00254 ftnint offset;
00255 char *varname;
00256 static Addrp badvar;
00257 register unsigned char *s;
00258 static int last_lineno;
00259 static char *last_varname;
00260
00261 if (varp->vstg == STGCOMMON) {
00262 if (!(dfile = blkdfile))
00263 dfile = blkdfile = opf(blkdfname, textwrite);
00264 }
00265 else {
00266 if (procclass == CLBLOCK) {
00267 if (varp != badvar) {
00268 badvar = varp;
00269 warn1("%s is not in a COMMON block",
00270 varp->uname_tag == UNAM_NAME
00271 ? varp->user.name->fvarname
00272 : "???");
00273 }
00274 return;
00275 }
00276 if (!(dfile = initfile))
00277 dfile = initfile = opf(initfname, textwrite);
00278 }
00279 varname = dataname(varp->vstg, varp->memno);
00280 offset = varp->memoffset->constblock.Const.ci;
00281 type = varp->vtype;
00282 valtype = valp->vtype;
00283 if(type!=TYCHAR && valtype==TYCHAR)
00284 {
00285 if(! ftn66flag
00286 && (last_varname != cur_varname || last_lineno != lineno)) {
00287 /* prevent multiple warnings */
00288 last_lineno = lineno;
00289 warn1(
00290 "non-character datum %.42s initialized with character string",
00291 last_varname = cur_varname);
00292 }
00293 varp->vleng = ICON(typesize[type]);
00294 varp->vtype = type = TYCHAR;
00295 }
00296 else if( (type==TYCHAR && valtype!=TYCHAR) ||
00297 (cktype(OPASSIGN,type,valtype) == TYERROR) )
00298 {
00299 err("incompatible types in initialization");
00300 return;
00301 }
00302 if(type == TYADDR)
00303 con.Const.ci = valp->Const.ci;
00304 else if(type != TYCHAR)
00305 {
00306 if(valtype == TYUNKNOWN)
00307 con.Const.ci = valp->Const.ci;
00308 else consconv(type, &con, valp);
00309 }
00310
00311 k = 1;
00312
00313 switch(type)
00314 {
00315 case TYLOGICAL:
00316 case TYINT1:
00317 case TYLOGICAL1:
00318 case TYLOGICAL2:
00319 case TYSHORT:
00320 case TYLONG:
00321 #ifdef TYQUAD
00322 case TYQUAD:
00323 #endif
00324 dataline(varname, offset, type);
00325 prconi(dfile, con.Const.ci);
00326 break;
00327
00328 case TYADDR:
00329 dataline(varname, offset, type);
00330 prcona(dfile, con.Const.ci);
00331 break;
00332
00333 case TYCOMPLEX:
00334 case TYDCOMPLEX:
00335 k = 2;
00336 case TYREAL:
00337 case TYDREAL:
00338 dataline(varname, offset, type);
00339 prconr(dfile, &con, k);
00340 break;
00341
00342 case TYCHAR:
00343 k = valp -> vleng -> constblock.Const.ci;
00344 if (elen < k)
00345 k = elen;
00346 s = (unsigned char *)valp->Const.ccp;
00347 for(i = 0 ; i < k ; ++i) {
00348 dataline(varname, offset++, TYCHAR);
00349 fprintf(dfile, "\t%d\n", *s++);
00350 }
00351 k = elen - valp->vleng->constblock.Const.ci;
00352 if(k > 0) {
00353 dataline(varname, offset, TYBLANK);
00354 fprintf(dfile, "\t%d\n", k);
00355 }
00356 break;
00357
00358 default:
00359 badtype("setdata", type);
00360 }
00361
00362 }
|
Variable Documentation
|
|
Definition at line 29 of file data.c. Referenced by nextdata(), and setdata(). |
|
|
Definition at line 28 of file data.c. Referenced by dataline(). |
|
|
Definition at line 239 of file data.c. Referenced by dataline(), and setdata(). |