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

##### Functions

    aryconst          X
    bytes             X
    even              X
    lwidth            X
    setran            X
    var               X
    varbeg            X
    varend            X
    width             X

       1: /*	@(#)var.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:  * Declare variables of a var part.  DPOFF1 is
      18:  * the local variable storage for all prog/proc/func
      19:  * modules aside from the block mark.  The total size
      20:  * of all the local variables is entered into the
      21:  * size array.
      22:  */
      23: varbeg()
      24: {
      25:
      26: #ifndef PI1
      27:     if (parts & VPRT)
      28:         error("All variables must be declared in one var part");
      29:     parts |= VPRT;
      30: #endif
      31: #ifndef PI0
      32:     sizes[cbn].om_max = sizes[cbn].om_off = -DPOFF1;
      33: #endif
      34:     forechain = NIL;
      35: #ifdef PI0
      36:     send(REVVBEG);
      37: #endif
      38: }
      39:
      40: var(vline, vidl, vtype)
      41: #ifdef PI0
      42:     int vline, *vidl, *vtype;
      43: {
      44:     register struct nl *np;
      45:     register int *vl;
      46:
      47:     np = gtype(vtype);
      48:     line = vline;
      49:     for (vl = vidl; vl != NIL; vl = vl[2])
      50:         enter(defnl(vl[1], VAR, np, 0));
      51:     send(REVVAR, vline, vidl, vtype);
      52: #else
      53:     int vline;
      54:     register int *vidl;
      55:     int *vtype;
      56: {
      57:     register struct nl *np;
      58:     register struct om *op;
      59:     long w;
      60:     int o2;
      61:
      62:     np = gtype(vtype);
      63:     line = vline;
      64:     w = (lwidth(np) + 1) &~ 1;
      65:     op = &sizes[cbn];
      66:     for (; vidl != NIL; vidl = vidl[2]) {
      67:         op->om_off -= w;
      68:         o2 = op->om_off;
      69:         enter(defnl(vidl[1], VAR, np, o2));
      70:     }
      71: #endif
      72: }
      73:
      74: varend()
      75: {
      76:
      77:     foredecl();
      78: #ifndef PI0
      79:     sizes[cbn].om_max = sizes[cbn].om_off;
      80: #else
      81:     send(REVVEND);
      82: #endif
      83: }
      84:
      85: /*
      86:  * Evening
      87:  */
      88: even(w)
      89:     register int w;
      90: {
      91:     if (w < 0)
      92:         return (w & ~1);
      93:     return ((w+1) & ~1);
      94: }
      95:
      96: /*
      97:  * Find the width of a type in bytes.
      98:  */
      99: width(np)
     100:     struct nl *np;
     101: {
     102:
     103:     return (lwidth(np));
     104: }
     105:
     106: long lwidth(np)
     107:     struct nl *np;
     108: {
     109:     register struct nl *p;
     110:     long w;
     111:
     112:     p = np;
     113:     if (p == NIL)
     114:         return (0);
     115: loop:
     116:     switch (p->class) {
     117:         case TYPE:
     118:             switch (nloff(p)) {
     119:                 case TNIL:
     120:                     return (2);
     121:                 case TSTR:
     122:                 case TSET:
     123:                     panic("width");
     124:                 default:
     125:                     p = p->type;
     126:                     goto loop;
     127:             }
     128:         case ARRAY:
     129:             return (aryconst(p, 0));
     130:         case PTR:
     131:         case FILET:
     132:             return ( sizeof ( int * ) );
     133:         case RANGE:
     134:             if (p->type == nl+TDOUBLE)
     135: #ifdef DEBUG
     136:                 return (hp21mx ? 4 : 8);
     137: #else
     138:                 return (8);
     139: #endif
     140:         case SCAL:
     141:             return (bytes(p->range[0], p->range[1]));
     142:         case SET:
     143:             setran(p->type);
     144:             return ( (set.uprbp>>3) + 1);
     145:         case STR:
     146:         case RECORD:
     147:             return ( p->value[NL_OFFS] );
     148:         default:
     149:             panic("wclass");
     150:     }
     151: }
     152:
     153: /*
     154:  * Return the width of an element
     155:  * of a n time subscripted np.
     156:  */
     157: long aryconst(np, n)
     158:     struct nl *np;
     159:     int n;
     160: {
     161:     register struct nl *p;
     162:     long s, d;
     163:
     164:     if ((p = np) == NIL)
     165:         return (NIL);
     166:     if (p->class != ARRAY)
     167:         panic("ary");
     168:     s = width(p->type);
     169:     /*
     170: 	 * Arrays of anything but characters are word aligned.
     171: 	 */
     172:     if (s & 1)
     173:         if (s != 1)
     174:             s++;
     175:     /*
     176: 	 * Skip the first n subscripts
     177: 	 */
     178:     while (n >= 0) {
     179:         p = p->chain;
     180:         n--;
     181:     }
     182:     /*
     183: 	 * Sum across remaining subscripts.
     184: 	 */
     185:     while (p != NIL) {
     186:         if (p->class != RANGE && p->class != SCAL)
     187:             panic("aryran");
     188:         d = p->range[1] - p->range[0] + 1;
     189:         s *= d;
     190:         p = p->chain;
     191:     }
     192:     return (s);
     193: }
     194:
     195: /*
     196:  * Find the lower bound of a set, and also its size in bits.
     197:  */
     198: setran(q)
     199:     struct nl *q;
     200: {
     201:     register lb, ub;
     202:     register struct nl *p;
     203:
     204:     p = q;
     205:     if (p == NIL)
     206:         return (NIL);
     207:     lb = p->range[0];
     208:     ub = p->range[1];
     209:     if (p->class != RANGE && p->class != SCAL)
     210:         panic("setran");
     211:     set.lwrb = lb;
     212:     /* set.(upperbound prime) = number of bits - 1; */
     213:     set.uprbp = ub-lb;
     214: }
     215:
     216: /*
     217:  * Return the number of bytes required to hold an arithmetic quantity
     218:  */
     219: bytes(lb, ub)
     220:     long lb, ub;
     221: {
     222:
     223: #ifndef DEBUG
     224:     if (lb < -32768 || ub > 32767)
     225:         return (4);
     226:     else if (lb < -128 || ub > 127)
     227:         return (2);
     228: #else
     229:     if (!hp21mx && (lb < -32768 || ub > 32767))
     230:         return (4);
     231:     if (lb < -128 || ub > 127)
     232:         return (2);
     233: #endif
     234:     else
     235:         return (1);
     236: }

#### Defined functions

aryconst defined in line 157; used 3 times

- in line 129
- in /usr/src/ucb/pascal/pi/0.h line 610
- in /usr/src/ucb/pascal/pi/lval.c line 265

bytes defined in line 219; used 4 times

- in line 141
- in /usr/src/ucb/pascal/pi/const.c line 144
- in /usr/src/ucb/pascal/pi/rval.c line 513
- in /usr/src/ucb/pascal/pi/type.c line 291

even defined in line 88; used 6 times

- in /usr/src/ucb/pascal/pi/call.c line 38
- in /usr/src/ucb/pascal/pi/fdec.c line 166
- in /usr/src/ucb/pascal/pi/proc.c line 248, 258
- in /usr/src/ucb/pascal/pi/put.c line 290
- in /usr/src/ucb/pascal/pi/rec.c line 172

lwidth defined in line 106; used 3 times

- in line 64, 103
- in /usr/src/ucb/pascal/pi/0.h line 609

setran defined in line 198; used 3 times

- in line 143
- in /usr/src/ucb/pascal/pi/cset.c line 138
- in /usr/src/ucb/pascal/pi/rval.c line 480

var defined in line 40; used 2 times

- in /usr/src/ucb/pascal/pi/pas.y line 257-260(2)

varbeg defined in line 23; used 2 times

- in /usr/src/ucb/pascal/pi/pas.y line 257, 264

varend defined in line 74; used 2 times

- in /usr/src/ucb/pascal/pi/pas.y line 170, 188

width defined in line 99; used 72 times

- in line 168
- in /usr/src/ucb/pascal/pi/call.c line 38
- in /usr/src/ucb/pascal/pi/case.c line 64
- in /usr/src/ucb/pascal/pi/conv.c line 27(2), 109(2), 169-170(2)
- in /usr/src/ucb/pascal/pi/cset.c line 102
- in /usr/src/ucb/pascal/pi/fdec.c line 166, 366
- in /usr/src/ucb/pascal/pi/func.c line 163, 170, 187, 205, 212, 227
- in /usr/src/ucb/pascal/pi/lval.c line 273-277(2)
- in /usr/src/ucb/pascal/pi/proc.c line 248, 258, 290, 330, 337-342(2), 448-452(2), 472, 537, 544, 595, 607, 644, 659, 676, 741, 761-762(2)
- in /usr/src/ucb/pascal/pi/rec.c line 172
- in /usr/src/ucb/pascal/pi/rval.c line 85, 110, 143-147(2), 167, 234, 280(2), 304(2), 310, 344(2), 379(2), 434(2), 443(2), 482
- in /usr/src/ucb/pascal/pi/stat.c line 240, 287-290(3), 356, 364, 383, 390-397(4)
- in /usr/src/ucb/pascal/pi/type.c line 152

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