Doxygen Source Code Documentation
exec.c File Reference
#include "defs.h"
#include "p1defs.h"
#include "names.h"
Go to the source code of this file.
Defines | |
#define | DOINIT par[0] |
#define | DOLIMIT par[1] |
#define | DOINCR par[2] |
#define | VARSTEP 0 |
#define | POSSTEP 1 |
#define | NEGSTEP 2 |
Functions | |
void exar2 | Argdcl ((int, tagptr, struct Labelblock *, struct Labelblock *)) |
void popctl | Argdcl ((void)) |
void pushctl | Argdcl ((int)) |
void | exif (expptr p) |
void | exelif (expptr p) |
void | exelse (Void) |
void | exendif () |
void | new_endif () |
LOCAL void | pushctl (int code) |
LOCAL void | popctl (Void) |
LOCAL void | poplab (Void) |
void | exgoto (struct Labelblock *lab) |
void | exequals (register struct Primblock *lp, register expptr rp) |
void | mkstfunct (struct Primblock *lp, expptr rp) |
void | mixed_type (Namep np) |
void | excall (Namep name, struct Listblock *args, int nstars, struct Labelblock **labels) |
void | exstop (int stop, register expptr p) |
void | exdo (int range, Namep loopname, chainp spec) |
void | exenddo (Namep np) |
void | enddo (int here) |
void | exassign (register Namep vname, struct Labelblock *labelval) |
void | exarif (expptr expr, struct Labelblock *neglab, struct Labelblock *zerlab, struct Labelblock *poslab) |
LOCAL void | exar2 (int op, expptr e, struct Labelblock *l1, struct Labelblock *l2) |
void | exreturn (register expptr p) |
void | exasgoto (Namep labvar) |
Variables | |
long | laststfcn = -1 |
long | thisstno |
int | doing_stmtfcn |
Define Documentation
|
Definition at line 399 of file exec.c. Referenced by exdo(). |
|
Definition at line 397 of file exec.c. Referenced by exdo(). |
|
Definition at line 398 of file exec.c. Referenced by exdo(). |
|
Definition at line 406 of file exec.c. Referenced by exdo(). |
|
Definition at line 405 of file exec.c. Referenced by exdo(). |
|
Definition at line 404 of file exec.c. Referenced by exdo(). |
Function Documentation
|
|
|
|
|
|
|
Definition at line 666 of file exec.c. References Expression::addrblock, CTLDO, Ctlframe::ctltype, deregister(), Ctlframe::dolabel, frexpr(), frtemp(), i, Addrblock::istemp, memversion(), mkplace(), NO, p1for_end(), popctl(), poplab(), puteq(), TADDR, and Expression::tag. Referenced by doiolist(), exenddo(), and yyparse().
00668 { 00669 register struct Ctlframe *q; 00670 Namep np; /* name of the current DO index */ 00671 Addrp ap; 00672 register int i; 00673 register expptr e; 00674 00675 /* Many DO's can end at the same statement, so keep looping over all 00676 nested indicies */ 00677 00678 while(here == dorange) 00679 { 00680 if(np = ctlstack->donamep) 00681 { 00682 p1for_end (); 00683 00684 /* Now we're done with all of the tests, and the loop has terminated. 00685 Store the index value back in long-term memory */ 00686 00687 if(ap = memversion(np)) 00688 puteq((expptr)ap, (expptr)mkplace(np)); 00689 for(i = 0 ; i < 4 ; ++i) 00690 ctlstack->ctlabels[i] = 0; 00691 deregister(ctlstack->donamep); 00692 ctlstack->donamep->vdovar = NO; 00693 /* ctlstack->dostep and ctlstack->domax can be zero */ 00694 /* with sufficiently bizarre (erroneous) syntax */ 00695 if (e = ctlstack->dostep) 00696 if (e->tag == TADDR && e->addrblock.istemp) 00697 frtemp((Addrp)e); 00698 else 00699 frexpr(e); 00700 if (e = ctlstack->domax) 00701 if (e->tag == TADDR && e->addrblock.istemp) 00702 frtemp((Addrp)e); 00703 else 00704 frexpr(e); 00705 if (e = ctlstack->doinit) 00706 frtemp((Addrp)e); 00707 } 00708 else if (ctlstack->dowhile) 00709 p1for_end (); 00710 00711 /* Set dorange to the closing label of the next most enclosing DO loop 00712 */ 00713 00714 popctl(); 00715 poplab(); 00716 dorange = 0; 00717 for(q = ctlstack ; q>=ctls ; --q) 00718 if(q->ctltype == CTLDO) 00719 { 00720 dorange = q->dolabel; 00721 break; 00722 } 00723 } 00724 } |
|
Definition at line 875 of file exec.c. References exgoto(), fixtype(), ICON, mkexpr(), p1_else(), p1_if(), p1else_end(), and putx(). Referenced by exarif().
|
|
Definition at line 816 of file exec.c. References addressable(), cpexpr(), ENULL, err, exar2(), exgoto(), fixtype(), frexpr(), ICON, mkexpr(), mktmp(), MSKINT, MSKREAL, ONEOF, OPASSIGN, OPEQ, OPGE, OPLE, OPLT, OPNE, p1_elif(), p1_else(), p1_if(), p1else_end(), putx(), and Labelblock::stateno. Referenced by yyparse().
00818 { 00819 register int lm, lz, lp; 00820 00821 lm = neglab->stateno; 00822 lz = zerlab->stateno; 00823 lp = poslab->stateno; 00824 expr = fixtype(expr); 00825 00826 if( ! ONEOF(expr->headblock.vtype, MSKINT|MSKREAL) ) 00827 { 00828 err("invalid type of arithmetic if expression"); 00829 frexpr(expr); 00830 } 00831 else 00832 { 00833 if (lm == lz && lz == lp) 00834 exgoto (neglab); 00835 else if(lm == lz) 00836 exar2(OPLE, expr, neglab, poslab); 00837 else if(lm == lp) 00838 exar2(OPNE, expr, neglab, zerlab); 00839 else if(lz == lp) 00840 exar2(OPGE, expr, zerlab, neglab); 00841 else { 00842 expptr t; 00843 00844 if (!addressable (expr)) { 00845 t = (expptr) mktmp(expr -> headblock.vtype, ENULL); 00846 expr = mkexpr (OPASSIGN, cpexpr (t), expr); 00847 } else 00848 t = (expptr) cpexpr (expr); 00849 00850 p1_if(putx(fixtype(mkexpr (OPLT, expr, ICON (0))))); 00851 exgoto(neglab); 00852 p1_elif (mkexpr (OPEQ, t, ICON (0))); 00853 exgoto(zerlab); 00854 p1_else (); 00855 exgoto(poslab); 00856 p1else_end (); 00857 } /* else */ 00858 } 00859 } |
|
Definition at line 923 of file exec.c. References err, ISINT, mkplace(), p1_asgoto(), and Addrblock::vtype. Referenced by yyparse().
|
|
Definition at line 732 of file exec.c. References ALLOC, CHNULL, Chain::datap, err, Labelblock::fmtlabused, fmtname(), Labelblock::fmtstring, ICON, Labelblock::labdefined, Labelblock::labused, Addrblock::memoffset, mkchain(), mkexpr(), mkintcon(), mkplace(), MSKADDR, MSKINT, Chain::nextp, Addrblock::ntempelt, ONEOF, OPASSIGN, putout(), q, Labelblock::stateno, STGAUTO, stno, TADDR, Addrblock::tag, UNAM_IDENT, Addrblock::uname_tag, Addrblock::user, Addrblock::vstg, and Addrblock::vtype. Referenced by yyparse().
00734 { 00735 Addrp p; 00736 register Addrp q; 00737 char *fs; 00738 register chainp cp, cpprev; 00739 register ftnint k, stno; 00740 00741 p = mkplace(vname); 00742 if( ! ONEOF(p->vtype, MSKINT|MSKADDR) ) { 00743 err("noninteger assign variable"); 00744 return; 00745 } 00746 00747 /* If the label hasn't been defined, then we do things twice: 00748 * once for an executable stmt label, once for a format 00749 */ 00750 00751 /* code for executable label... */ 00752 00753 /* Now store the assigned value in a list associated with this variable. 00754 This will be used later to generate a switch() statement in the C output */ 00755 00756 fs = labelval->fmtstring; 00757 if (!labelval->labdefined || !fs) { 00758 00759 if (vname -> vis_assigned == 0) { 00760 vname -> varxptr.assigned_values = CHNULL; 00761 vname -> vis_assigned = 1; 00762 } 00763 00764 /* don't duplicate labels... */ 00765 00766 stno = labelval->stateno; 00767 cpprev = 0; 00768 for(k = 0, cp = vname->varxptr.assigned_values; 00769 cp; cpprev = cp, cp = cp->nextp, k++) 00770 if ((ftnint)cp->datap == stno) 00771 break; 00772 if (!cp) { 00773 cp = mkchain((char *)stno, CHNULL); 00774 if (cpprev) 00775 cpprev->nextp = cp; 00776 else 00777 vname->varxptr.assigned_values = cp; 00778 labelval->labused = 1; 00779 } 00780 putout(mkexpr(OPASSIGN, (expptr)p, mkintcon(k))); 00781 } 00782 00783 /* Code for FORMAT label... */ 00784 00785 if (!labelval->labdefined || fs) { 00786 00787 labelval->fmtlabused = 1; 00788 p = ALLOC(Addrblock); 00789 p->tag = TADDR; 00790 p->vtype = TYCHAR; 00791 p->vstg = STGAUTO; 00792 p->memoffset = ICON(0); 00793 fmtname(vname, p); 00794 q = ALLOC(Addrblock); 00795 q->tag = TADDR; 00796 q->vtype = TYCHAR; 00797 q->vstg = STGAUTO; 00798 q->ntempelt = 1; 00799 q->memoffset = ICON(0); 00800 q->uname_tag = UNAM_IDENT; 00801 sprintf(q->user.ident, "fmt_%ld", labelval->stateno); 00802 putout(mkexpr(OPASSIGN, (expptr)p, (expptr)q)); 00803 } 00804 00805 } /* exassign */ |
|
Definition at line 312 of file exec.c. References CHNULL, Expression::exprblock, fixtype(), frexpr(), Expression::headblock, Exprblock::leftp, mixed_type(), mkfunct(), mkprim(), name, p, putcmgo(), putexpr(), putx(), settype(), Expression::tag, TERROR, TYINT, Headblock::vtype, and Exprblock::vtype. Referenced by yyparse().
00314 { 00315 register expptr p; 00316 00317 if (name->vtype != TYSUBR) { 00318 if (name->vinfproc && !name->vcalled) { 00319 name->vtype = TYSUBR; 00320 frexpr(name->vleng); 00321 name->vleng = 0; 00322 } 00323 else if (!name->vimpltype && name->vtype != TYUNKNOWN) 00324 mixed_type(name); 00325 else 00326 settype(name, TYSUBR, (ftnint)0); 00327 } 00328 p = mkfunct( mkprim(name, args, CHNULL) ); 00329 if (p->tag == TERROR) 00330 return; 00331 00332 /* Subroutines and their identifiers acquire the type INT */ 00333 00334 p->exprblock.vtype = p->exprblock.leftp->headblock.vtype = TYINT; 00335 00336 /* Handle the alternate return mechanism */ 00337 00338 if(nstars > 0) 00339 putcmgo(putx(fixtype(p)), nstars, labels); 00340 else 00341 putexpr(p); 00342 } |
|
Definition at line 420 of file exec.c. References conssgn(), cpexpr(), CTLDO, Chain::datap, dclerr(), DOINCR, DOINIT, DOLIMIT, ENULL, err, erri(), errstr(), fixtype(), frchain(), frexpr(), Nameblock::fvarname, Expression::headblock, i, ICON, ISCONST, mkconv(), mkexpr(), mkplace(), mktmp(), mktmp0(), MSKINT, MSKREAL, NEGSTEP, Chain::nextp, NOEXT, ONEOF, OPASSIGN, OPCOLON, OPEQ, OPGE, OPLE, OPLT, OPMINUS, OPOR, OPPLUSEQ, OPQUEST, p1_for(), POSSTEP, pushctl(), puteq(), putwhile(), putx(), TYLABEL, VARSTEP, Nameblock::vclass, Nameblock::vdcldone, Nameblock::vdovar, Nameblock::vprocclass, Headblock::vtype, Addrblock::vtype, Nameblock::vtype, warn(), and YES. Referenced by doiolist(), and yyparse().
00424 { 00425 register expptr p; 00426 register Namep np; 00427 chainp cp; /* loops over the fields in spec */ 00428 register int i; 00429 int dotype; /* type of the index variable */ 00430 int incsign; /* sign of the increment, if it's constant 00431 */ 00432 Addrp dovarp; /* loop index variable */ 00433 expptr doinit; /* constant or register for init param */ 00434 expptr par[3]; /* local specification parameters */ 00435 00436 expptr init, test, inc; /* Expressions in the resulting FOR loop */ 00437 00438 00439 test = ENULL; 00440 00441 pushctl(CTLDO); 00442 dorange = ctlstack->dolabel = range; 00443 ctlstack->loopname = loopname; 00444 00445 /* Declare the loop index */ 00446 00447 np = (Namep)spec->datap; 00448 ctlstack->donamep = NULL; 00449 if (!np) { /* do while */ 00450 ctlstack->dowhile = 1; 00451 #if 0 00452 if (loopname) { 00453 if (loopname->vtype == TYUNKNOWN) { 00454 loopname->vdcldone = 1; 00455 loopname->vclass = CLLABEL; 00456 loopname->vprocclass = PLABEL; 00457 loopname->vtype = TYLABEL; 00458 } 00459 if (loopname->vtype == TYLABEL) 00460 if (loopname->vdovar) 00461 dclerr("already in use as a loop name", 00462 loopname); 00463 else 00464 loopname->vdovar = 1; 00465 else 00466 dclerr("already declared; cannot be a loop name", 00467 loopname); 00468 } 00469 #endif 00470 putwhile((expptr)spec->nextp); 00471 NOEXT("do while"); 00472 spec->nextp = 0; 00473 frchain(&spec); 00474 return; 00475 } 00476 if(np->vdovar) 00477 { 00478 errstr("nested loops with variable %s", np->fvarname); 00479 ctlstack->donamep = NULL; 00480 return; 00481 } 00482 00483 /* Create a memory-resident version of the index variable */ 00484 00485 dovarp = mkplace(np); 00486 if( ! ONEOF(dovarp->vtype, MSKINT|MSKREAL) ) 00487 { 00488 err("bad type on do variable"); 00489 return; 00490 } 00491 ctlstack->donamep = np; 00492 00493 np->vdovar = YES; 00494 00495 /* Now dovarp points to the index to be used within the loop, dostgp 00496 points to the one which may need to be stored */ 00497 00498 dotype = dovarp->vtype; 00499 00500 /* Count the input specifications and type-check each one independently; 00501 this just eliminates non-numeric values from the specification */ 00502 00503 for(i=0 , cp = spec->nextp ; cp!=NULL && i<3 ; cp = cp->nextp) 00504 { 00505 p = par[i++] = fixtype((tagptr)cp->datap); 00506 if( ! ONEOF(p->headblock.vtype, MSKINT|MSKREAL) ) 00507 { 00508 err("bad type on DO parameter"); 00509 return; 00510 } 00511 } 00512 00513 frchain(&spec); 00514 switch(i) 00515 { 00516 case 0: 00517 case 1: 00518 err("too few DO parameters"); 00519 return; 00520 00521 default: 00522 err("too many DO parameters"); 00523 return; 00524 00525 case 2: 00526 DOINCR = (expptr) ICON(1); 00527 00528 case 3: 00529 break; 00530 } 00531 00532 00533 /* Now all of the local specification fields are set, but their types are 00534 not yet consistent */ 00535 00536 /* Declare the loop initialization value, casting it properly and declaring a 00537 register if need be */ 00538 00539 ctlstack->doinit = 0; 00540 if (ISCONST (DOINIT) || !onetripflag) 00541 /* putx added 6-29-89 (mwm), not sure if fixtype is required, but I doubt it 00542 since mkconv is called just before */ 00543 doinit = putx (mkconv (dotype, DOINIT)); 00544 else { 00545 if (onetripflag) 00546 ctlstack->doinit = doinit = (expptr) mktmp0(dotype, ENULL); 00547 else 00548 doinit = (expptr) mktmp(dotype, ENULL); 00549 puteq (cpexpr (doinit), DOINIT); 00550 } /* else */ 00551 00552 /* Declare the loop ending value, casting it to the type of the index 00553 variable */ 00554 00555 if( ISCONST(DOLIMIT) ) 00556 ctlstack->domax = mkconv(dotype, DOLIMIT); 00557 else { 00558 ctlstack->domax = (expptr) mktmp0(dotype, ENULL); 00559 puteq (cpexpr (ctlstack -> domax), DOLIMIT); 00560 } /* else */ 00561 00562 /* Declare the loop increment value, casting it to the type of the index 00563 variable */ 00564 00565 if( ISCONST(DOINCR) ) 00566 { 00567 ctlstack->dostep = mkconv(dotype, DOINCR); 00568 if( (incsign = conssgn(ctlstack->dostep)) == 0) 00569 err("zero DO increment"); 00570 ctlstack->dostepsign = (incsign > 0 ? POSSTEP : NEGSTEP); 00571 } 00572 else 00573 { 00574 ctlstack->dostep = (expptr) mktmp0(dotype, ENULL); 00575 ctlstack->dostepsign = VARSTEP; 00576 puteq (cpexpr (ctlstack -> dostep), DOINCR); 00577 } 00578 00579 /* All data is now properly typed and in the ctlstack, except for the 00580 initial value. Assignments of temps have been generated already */ 00581 00582 switch (ctlstack -> dostepsign) { 00583 case VARSTEP: 00584 test = mkexpr (OPQUEST, mkexpr (OPLT, 00585 cpexpr (ctlstack -> dostep), ICON(0)), 00586 mkexpr (OPCOLON, 00587 mkexpr (OPGE, cpexpr((expptr)dovarp), 00588 cpexpr (ctlstack -> domax)), 00589 mkexpr (OPLE, cpexpr((expptr)dovarp), 00590 cpexpr (ctlstack -> domax)))); 00591 break; 00592 case POSSTEP: 00593 test = mkexpr (OPLE, cpexpr((expptr)dovarp), 00594 cpexpr (ctlstack -> domax)); 00595 break; 00596 case NEGSTEP: 00597 test = mkexpr (OPGE, cpexpr((expptr)dovarp), 00598 cpexpr (ctlstack -> domax)); 00599 break; 00600 default: 00601 erri ("exdo: bad dostepsign '%d'", ctlstack -> dostepsign); 00602 break; 00603 } /* switch (ctlstack -> dostepsign) */ 00604 00605 if (onetripflag) 00606 test = mkexpr (OPOR, test, 00607 mkexpr (OPEQ, cpexpr((expptr)dovarp), cpexpr (doinit))); 00608 init = mkexpr (OPASSIGN, cpexpr((expptr)dovarp), 00609 ctlstack->doinit ? cpexpr(doinit) : doinit); 00610 inc = mkexpr (OPPLUSEQ, (expptr)dovarp, cpexpr (ctlstack -> dostep)); 00611 00612 if (!onetripflag && ISCONST (ctlstack -> domax) && ISCONST (doinit) 00613 && ctlstack -> dostepsign != VARSTEP) { 00614 expptr tester; 00615 00616 tester = mkexpr (OPMINUS, cpexpr (doinit), 00617 cpexpr (ctlstack -> domax)); 00618 if (incsign == conssgn (tester)) 00619 warn ("DO range never executed"); 00620 frexpr (tester); 00621 } /* if !onetripflag && */ 00622 00623 p1_for (init, test, inc); 00624 } |
|
Definition at line 53 of file exec.c. References CNULL, CTLIF, CTLIFX, execerr(), p, and putif(). Referenced by yyparse().
|
|
Definition at line 66 of file exec.c. References CNULL, CTLELSE, CTLIF, CTLIFX, Ctlframe::ctltype, execerr(), and p1_else(). Referenced by yyparse().
|
|
Definition at line 631 of file exec.c. References CTLDO, Ctlframe::ctltype, Ctlframe::dolabel, enddo(), err, errstr(), Nameblock::fvarname, and Ctlframe::loopname. Referenced by yyparse().
00633 { 00634 Namep np1; 00635 int here; 00636 struct Ctlframe *cf; 00637 00638 if( ctlstack < ctls ) 00639 goto misplaced; 00640 here = ctlstack->dolabel; 00641 if (ctlstack->ctltype != CTLDO 00642 || here >= 0 && (!thislabel || thislabel->labelno != here)) { 00643 misplaced: 00644 err("misplaced ENDDO"); 00645 return; 00646 } 00647 if (np != ctlstack->loopname) { 00648 if (np1 = ctlstack->loopname) 00649 errstr("expected \"enddo %s\"", np1->fvarname); 00650 else 00651 err("expected unnamed ENDDO"); 00652 for(cf = ctls; cf < ctlstack; cf++) 00653 if (cf->ctltype == CTLDO && cf->loopname == np) { 00654 here = cf->dolabel; 00655 break; 00656 } 00657 } 00658 enddo(here); 00659 } |
|
Definition at line 83 of file exec.c. References CNULL, CTLELSE, CTLIF, CTLIFX, execerr(), p1_endif(), p1else_end(), and popctl(). Referenced by endio(), putiocall(), and yyparse().
00085 { 00086 while(ctlstack->ctltype == CTLIFX) { 00087 popctl(); 00088 p1else_end(); 00089 } 00090 if(ctlstack->ctltype == CTLIF) { 00091 popctl(); 00092 p1_endif (); 00093 } 00094 else if(ctlstack->ctltype == CTLELSE) { 00095 popctl(); 00096 p1else_end (); 00097 } 00098 else 00099 execerr("endif out of place", CNULL); 00100 } |
|
Definition at line 197 of file exec.c. References Primblock::argsp, CLVAR, enddcl(), err, errstr(), fixtype(), frexpr(), Nameblock::fvarname, INDATA, INEXEC, mklhs(), mkstfunct(), Primblock::namep, puteq(), Primblock::tag, TPRIM, Nameblock::vclass, and Primblock::vtype. Referenced by yyparse().
00199 { 00200 if(lp->tag != TPRIM) 00201 { 00202 err("assignment to a non-variable"); 00203 frexpr((expptr)lp); 00204 frexpr(rp); 00205 } 00206 else if(lp->namep->vclass!=CLVAR && lp->argsp) 00207 { 00208 if(parstate >= INEXEC) 00209 errstr("statement function %.62s amid executables.", 00210 lp->namep->fvarname); 00211 mkstfunct(lp, rp); 00212 } 00213 else if (lp->vtype == TYSUBR) 00214 err("illegal use of subroutine name"); 00215 else 00216 { 00217 expptr new_lp, new_rp; 00218 00219 if(parstate < INDATA) 00220 enddcl(); 00221 new_lp = mklhs (lp, keepsubs); 00222 new_rp = fixtype (rp); 00223 puteq(new_lp, new_rp); 00224 } 00225 } |
|
Definition at line 179 of file exec.c. References Labelblock::labused, and p1_goto(). Referenced by endio(), exar2(), exarif(), putiocall(), and yyparse().
|
|
Definition at line 40 of file exec.c. References CTLIF, p, pushctl(), and putif(). Referenced by endio(), putiocall(), and yyparse().
|
|
Definition at line 897 of file exec.c. References CLPROC, ENULL, err, fixtype(), ICON, mkconv(), p1_subr_ret(), and warn(). Referenced by yyparse().
00899 { 00900 if(procclass != CLPROC) 00901 warn("RETURN statement in main or block data"); 00902 if(p && (proctype!=TYSUBR || procclass!=CLPROC) ) 00903 { 00904 err("alternate return in nonsubroutine"); 00905 p = 0; 00906 } 00907 00908 if (p || proctype == TYSUBR) { 00909 if (p == ENULL) p = ICON (0); 00910 p = mkconv (TYLONG, fixtype (p)); 00911 p1_subr_ret (p); 00912 } /* if p || proctype == TYSUBR */ 00913 else 00914 p1_subr_ret((expptr)retslot); 00915 } |
|
Definition at line 351 of file exec.c. References call1(), Constant::ccp1, Constant::ci, CNULL, Constblock::Const, Expression::constblock, convic(), copyn(), execerr(), frexpr(), ICON, ISCONST, ISINT, mkstrcon(), putexpr(), Constblock::vleng, and Constblock::vtype. Referenced by yyparse().
00353 { 00354 char *str; 00355 int n; 00356 00357 if(p) 00358 { 00359 if( ! ISCONST(p) ) 00360 { 00361 execerr("pause/stop argument must be constant", CNULL); 00362 frexpr(p); 00363 p = mkstrcon(0, CNULL); 00364 } 00365 else if( ISINT(p->constblock.vtype) ) 00366 { 00367 str = convic(p->constblock.Const.ci); 00368 n = strlen(str); 00369 if(n > 0) 00370 { 00371 p->constblock.Const.ccp = copyn(n, str); 00372 p->constblock.Const.ccp1.blanks = 0; 00373 p->constblock.vtype = TYCHAR; 00374 p->constblock.vleng = (expptr) ICON(n); 00375 } 00376 else 00377 p = (expptr) mkstrcon(0, CNULL); 00378 } 00379 else if(p->constblock.vtype != TYCHAR) 00380 { 00381 execerr("pause/stop argument must be integer or string", CNULL); 00382 p = (expptr) mkstrcon(0, CNULL); 00383 } 00384 } 00385 else p = (expptr) mkstrcon(0, CNULL); 00386 00387 { 00388 expptr subr_call; 00389 00390 subr_call = call1(TYSUBR, (stop ? "s_stop" : "s_paus"), p); 00391 putexpr( subr_call ); 00392 } 00393 } |
|
Definition at line 295 of file exec.c. References warn(). Referenced by excall().
|
|
Definition at line 240 of file exec.c. References args, Primblock::argsp, CHNULL, CLPROC, CLUNKNOWN, Chain::datap, dclerr(), doing_stmtfcn, err, free, impldcl(), laststfcn, Listblock::listp, mkchain(), Primblock::namep, Chain::nextp, PSTFUNCT, STGSTFUNCT, thisstno, TPRIM, vardcl(), and Nameblock::vclass. Referenced by exequals().
00242 { 00243 register struct Primblock *p; 00244 register Namep np; 00245 chainp args; 00246 00247 laststfcn = thisstno; 00248 np = lp->namep; 00249 if(np->vclass == CLUNKNOWN) 00250 np->vclass = CLPROC; 00251 else 00252 { 00253 dclerr("redeclaration of statement function", np); 00254 return; 00255 } 00256 np->vprocclass = PSTFUNCT; 00257 np->vstg = STGSTFUNCT; 00258 00259 /* Set the type of the function */ 00260 00261 impldcl(np); 00262 if (np->vtype == TYCHAR && !np->vleng) 00263 err("character statement function with length (*)"); 00264 args = (lp->argsp ? lp->argsp->listp : CHNULL); 00265 np->varxptr.vstfdesc = mkchain((char *)args, (chainp)rp); 00266 00267 for(doing_stmtfcn = 1 ; args ; args = args->nextp) 00268 00269 /* It is an error for the formal parameters to have arguments or 00270 subscripts */ 00271 00272 if( ((tagptr)(args->datap))->tag!=TPRIM || 00273 (p = (struct Primblock *)(args->datap) )->argsp || 00274 p->fcharp || p->lcharp ) { 00275 err("non-variable argument in statement function definition"); 00276 args->datap = 0; 00277 } 00278 else 00279 { 00280 00281 /* Replace the name on the left-hand side */ 00282 00283 args->datap = (char *)p->namep; 00284 vardcl(p -> namep); 00285 free((char *)p); 00286 } 00287 doing_stmtfcn = 0; 00288 } |
|
Definition at line 107 of file exec.c. References CTLIF, CTLIFX, err, and pushctl(). Referenced by putif().
|
|
Definition at line 141 of file exec.c. References Fatal(). Referenced by enddo(), and exendif().
00142 { 00143 if( ctlstack-- < ctls ) 00144 Fatal("control stack empty"); 00145 --blklevel; 00146 } |
|
Definition at line 153 of file exec.c. References Labelblock::blklevel, Labelblock::labdefined, Labelblock::labinacc, and YES. Referenced by enddo().
00154 { 00155 register struct Labelblock *lp; 00156 00157 for(lp = labeltab ; lp < highlabtab ; ++lp) 00158 if(lp->labdefined) 00159 { 00160 /* mark all labels in inner blocks unreachable */ 00161 if(lp->blklevel > blklevel) 00162 lp->labinacc = YES; 00163 } 00164 else if(lp->blklevel > blklevel) 00165 { 00166 /* move all labels referred to in inner blocks out a level */ 00167 lp->blklevel = blklevel; 00168 } 00169 } |
|
Definition at line 124 of file exec.c. Referenced by exdo(), exif(), and new_endif().
00126 { 00127 register int i; 00128 00129 if(++ctlstack >= lastctl) 00130 many("loops or if-then-elses", 'c', maxctl); 00131 ctlstack->ctltype = code; 00132 for(i = 0 ; i < 4 ; ++i) 00133 ctlstack->ctlabels[i] = 0; 00134 ctlstack->dowhile = 0; 00135 ctlstack->domax = ctlstack->dostep = 0; /* in case of errors */ 00136 ++blklevel; 00137 } |
Variable Documentation
|
Definition at line 232 of file exec.c. Referenced by mkstfunct(), and vardcl(). |
|
Definition at line 231 of file exec.c. Referenced by mkstfunct(), and yyparse(). |
|
Definition at line 231 of file exec.c. Referenced by mkstfunct(), and yyparse(). |