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