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(). |