# 2.11BSD#431 - /usr/src/ucb/pascal/pi/lab.c

##### Functions

    gotoop            X
    label             X
    labeled           X

       1: /*	@(#)lab.c	2.2	SCCS id keyword	*/
       2: /* Copyright (c) 1979 Regents of the University of California */
       3: #
       4: /*
       5:  * pi - Pascal interpreter code translator
       6:  *
       7:  * Charles Haley, Bill Joy UCB
       8:  * Version 1.2 November 1978
       9:  */
      10:
      11: #include "whoami"
      12: #include "0.h"
      13: #include "tree.h"
      14: #include "opcode.h"
      15:
      16: /*
      17:  * Label enters the definitions
      18:  * of the label declaration part
      19:  * into the namelist.
      20:  */
      21: label(r, l)
      22:     int *r, l;
      23: {
      24: #ifndef PI0
      25:     register *ll;
      26:     register struct nl *p, *lp;
      27:
      28:     lp = NIL;
      29: #else
      30:     send(REVLAB, r);
      31: #endif
      32:     line = l;
      33: #ifndef PI1
      34:     if (parts & (CPRT|TPRT|VPRT))
      35:         error("Label declarations must precede const, type and var declarations");
      36:     if (parts & LPRT)
      37:         error("All labels must be declared in one label part");
      38:     parts |= LPRT;
      39: #endif
      40: #ifndef PI0
      41:     for (ll = r; ll != NIL; ll = ll[2]) {
      42:         l = getlab();
      43:         p = enter(defnl(ll[1], LABEL, 0, l));
      44:         /*
      45: 		 * Get the label for the eventual target
      46: 		 */
      47:         p->value[1] = getlab();
      48:         p->chain = lp;
      49:         p->nl_flags |= (NFORWD|NMOD);
      50:         p->value[NL_GOLEV] = NOTYET;
      51:         lp = p;
      52:         /*
      53: 		 * This operator is between
      54: 		 * the bodies of two procedures
      55: 		 * and provides a target for
      56: 		 * gotos for this label via TRA.
      57: 		 */
      58:         putlab(l);
      59:         put2(O_GOTO | cbn<<9, p->value[1]);
      60:     }
      61:     gotos[cbn] = lp;
      62: #endif
      63: }
      64:
      65: #ifndef PI0
      66: /*
      67:  * Gotoop is called when
      68:  * we get a statement "goto label"
      69:  * and generates the needed tra.
      70:  */
      71: gotoop(s)
      72:     char *s;
      73: {
      74:     register struct nl *p;
      75:
      76:     gocnt++;
      77:     p = lookup(s);
      78:     if (p == NIL)
      79:         return (NIL);
      80:     put2(O_TRA, p->value[0]);
      81:     if (bn == cbn)
      82:         if (p->nl_flags & NFORWD) {
      83:             if (p->value[NL_GOLEV] == NOTYET) {
      84:                 p->value[NL_GOLEV] = level;
      85:                 p->value[NL_GOLINE] = line;
      86:             }
      87:         } else
      88:             if (p->value[NL_GOLEV] == DEAD) {
      89:                 recovered();
      90:                 error("Goto %s is into a structured statement", p->symbol);
      91:             }
      92: }
      93:
      94: /*
      95:  * Labeled is called when a label
      96:  * definition is encountered, and
      97:  * marks that it has been found and
      98:  * patches the associated GOTO generated
      99:  * by gotoop.
     100:  */
     101: labeled(s)
     102:     char *s;
     103: {
     104:     register struct nl *p;
     105:
     106:     p = lookup(s);
     107:     if (p == NIL)
     108:         return (NIL);
     109:     if (bn != cbn) {
     110:         error("Label %s not defined in correct block", s);
     111:         return;
     112:     }
     113:     if ((p->nl_flags & NFORWD) == 0) {
     114:         error("Label %s redefined", s);
     115:         return;
     116:     }
     117:     p->nl_flags &= ~NFORWD;
     118:     patch(p->value[1]);
     119:     if (p->value[NL_GOLEV] != NOTYET)
     120:         if (p->value[NL_GOLEV] < level) {
     121:             recovered();
     122:             error("Goto %s from line %d is into a structured statement", s, p->value[NL_GOLINE]);
     123:         }
     124:     p->value[NL_GOLEV] = level;
     125: }
     126: #endif

#### Defined functions

gotoop defined in line 71; used 1 times

- in /usr/src/ucb/pascal/pi/stat.c line 73

label defined in line 21; used 1 times

- in /usr/src/ucb/pascal/pi/pas.y line 197

labeled defined in line 101; used 1 times

- in /usr/src/ucb/pascal/pi/stat.c line 51

Last modified: 1981-07-10 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 588 |