Annotation of 42BSD/ingres/source/ovqp/interp1.c, revision 1.1

1.1     ! root        1: # include      <ingres.h>
        !             2: # include      <aux.h>
        !             3: # include      <symbol.h>
        !             4: # include      <tree.h>
        !             5: # include      "../decomp/globs.h"
        !             6: # include      <sccs.h>
        !             7: 
        !             8: SCCSID(@(#)interp1.c   7.2     3/6/81)
        !             9: 
        !            10: 
        !            11: /*
        !            12: **     INTERP1.C
        !            13: **
        !            14: **     symbol I/O utility routines for OVQP interpreter.
        !            15: **
        !            16: */
        !            17: 
        !            18: /*
        !            19: ** GETSYMBOL
        !            20: **
        !            21: **     Gets (type, len, value) symbols from list
        !            22: **     A ptr to the list is advanced after
        !            23: **     call.  Symbols are moved to a target location
        !            24: **     (typically a slot on the interpreter's De.ov_stack).
        !            25: **     Legality of symbol type and length is checked.
        !            26: **     Returns         1  if no more symbols in list
        !            27: **                     0 otherwise
        !            28: **
        !            29: */
        !            30: 
        !            31: getsymbol(ts, p)
        !            32: SYMBOL *ts;            /* target location (on stack) */
        !            33: SYMBOL ***p;           /* pointer to list */
        !            34: {
        !            35:        int                     len;    /*length of target symbol*/
        !            36:        register union symvalue *d;     /* ptr to data for target symbol */
        !            37:        register SYMBOL         *cp;    /* the item in the list */
        !            38:        register SYMBOL         *tops;  /* target location on stack */
        !            39:        register union symvalue *val;
        !            40: 
        !            41:        tops = ts;      /* copy stack pointer */
        !            42:        cp = **p;       /* get list pointer */
        !            43: 
        !            44: #      ifdef xOTR1
        !            45:        if (tTf(84, 0))
        !            46:        {
        !            47:                printf("GETSYM: ");
        !            48:                prsym(cp);
        !            49:        }
        !            50: #      endif
        !            51: 
        !            52:        if (tops >= (SYMBOL *) &De.ov_stack[STACKSIZ])
        !            53:                ov_err(STACKOVER);
        !            54: 
        !            55:        val = &cp->value;
        !            56:        /* decomp will put the s_var's value in the right place 
        !            57:         * if this is the case
        !            58:         */
        !            59:        if (cp->type == VAR || cp->type == S_VAR)
        !            60:        {
        !            61:                tops->type = val->sym_var.varfrmt;
        !            62:                len = tops->len = val->sym_var.varfrml;
        !            63:                d = (union symvalue *) val->sym_var.valptr;
        !            64:        }
        !            65:        else
        !            66:        {
        !            67:                tops->type = cp->type;
        !            68:                len = tops->len = cp->len;
        !            69:                len &= 0377;
        !            70:                d = &cp->value;
        !            71:        }
        !            72:        /* advance De.ov_qvect sequencing pointer p */
        !            73:        *p += 1;
        !            74: 
        !            75:        switch(tops->type)
        !            76:        {
        !            77:          case INT:
        !            78:                switch (len)
        !            79:                {
        !            80:                  case 1:
        !            81:                        tops->value.sym_data.i2type = d->sym_data.i1type;
        !            82:                        break;
        !            83:                  case 2:
        !            84:                  case 4:
        !            85:                        bmove((char *) d, (char *) &tops->value.sym_data, len);
        !            86:                        break;
        !            87: 
        !            88:                  default:
        !            89:                        syserr("getsym:bad int len %d",len);
        !            90:                }
        !            91:                break;
        !            92: 
        !            93:          case FLOAT:
        !            94:                switch (len)
        !            95:                {
        !            96:                  case 4:
        !            97:                        tops->value.sym_data.f8type = d->sym_data.f4type;
        !            98:                        break;
        !            99: 
        !           100:                  case 8:
        !           101:                        tops->value.sym_data.f8type = d->sym_data.f8type;
        !           102:                        break;
        !           103: 
        !           104:                  default:
        !           105:                        syserr("getsym:bad FLOAT len %d",len);
        !           106:                }
        !           107:                break;
        !           108: 
        !           109:          case CHAR:
        !           110:                tops->value.sym_data.cptype = d->sym_data.c0type;
        !           111:                break;
        !           112: 
        !           113:          case AOP:
        !           114:          case BOP:
        !           115:          case UOP:
        !           116:          case COP:
        !           117:                tops->value.sym_op.opno = d->sym_op.opno;
        !           118:                break;
        !           119: 
        !           120:          case RESDOM:
        !           121:                tops->value.sym_resdom.resno = d->sym_resdom.resno;
        !           122:                break;
        !           123: 
        !           124:          case AND:
        !           125:          case OR:
        !           126:                break;
        !           127: 
        !           128:          case AGHEAD:
        !           129:          case BYHEAD:
        !           130:          case ROOT:
        !           131:          case QLEND:
        !           132:                return (1);     /* all these are delimitors between lists */
        !           133: 
        !           134:          default:
        !           135:                syserr("getsym:bad type %d", tops->type);
        !           136:        }
        !           137:        return(0);
        !           138: }
        !           139: /*
        !           140: **  TOUT
        !           141: **
        !           142: **     Copies a symbol value into the Output tuple buffer.
        !           143: **     Used to write target
        !           144: **     list elements or aggregate values into the output tuple.&
        !           145: */
        !           146: 
        !           147: tout(s, offp, rlen)
        !           148: register SYMBOL        *s;
        !           149: char           *offp;
        !           150: int            rlen;
        !           151: {
        !           152:        register int    i;
        !           153:        register char   *p;
        !           154:        int             slen;
        !           155: 
        !           156: #      ifdef xOTR1
        !           157:        if (tTf(84, 3))
        !           158:        {
        !           159:                printf("TOUT: s=");
        !           160:                prstack(s);
        !           161:                printf("  offset=%d, rlen=%d\n", offp-De.ov_outtup, rlen);
        !           162:        }
        !           163: #      endif
        !           164:        if (s->type == CHAR)
        !           165:        {
        !           166:                slen = s->len & 0377;
        !           167:                rlen &= 0377;
        !           168:                i = rlen - slen;        /* compute difference between sizes */
        !           169:                if (i <= 0)
        !           170:                {
        !           171:                        bmove(s->value.sym_data.cptype, offp, rlen);
        !           172:                }
        !           173:                else
        !           174:                {
        !           175:                        p = s->value.sym_data.cptype;
        !           176:                        bmove(p, offp, slen);
        !           177:                        p = &offp[slen];
        !           178:                        while (i--)
        !           179:                                *p++ = ' ';     /* blank out remainder */
        !           180:                }
        !           181:        }
        !           182:        else
        !           183:        {
        !           184:                bmove((char *)&s->value, offp, rlen);
        !           185:        }
        !           186: }
        !           187: /*
        !           188: **  RCVT
        !           189: */
        !           190: rcvt(tos, restype, reslen)
        !           191: register SYMBOL        *tos;
        !           192: int            restype, reslen;
        !           193: {
        !           194:        register int    rtype, rlen;
        !           195:        int             stype, slen;
        !           196: 
        !           197:        rtype = restype;
        !           198:        rlen = reslen;
        !           199:        stype = tos->type;
        !           200:        slen= tos->len;
        !           201: #      ifdef xOTR1
        !           202:        if (tTf(84, 6))
        !           203:        {
        !           204:                printf("RCVT:type=");
        !           205:                xputchar(rtype);
        !           206:                printf("%3d, tos=", rlen);
        !           207:                prstack(tos);
        !           208:        }
        !           209: #      endif
        !           210: 
        !           211:        if (rtype != stype)
        !           212:        {
        !           213:                if (rtype == CHAR || stype == CHAR)
        !           214:                        ov_err(BADCONV);        /* bad char to numeric conversion requested */
        !           215:                if (rtype == FLOAT)
        !           216:                        itof(tos);
        !           217:                else
        !           218:                {
        !           219:                        if (rlen == 4)
        !           220:                                ftoi4(tos);
        !           221:                        else
        !           222:                                ftoi2(tos);
        !           223:                }
        !           224:                tos->len = rlen;        /* handles conversion to i1 or f4 */
        !           225:        }
        !           226: 
        !           227:        else
        !           228:        {
        !           229:                if (rtype != CHAR && rlen != slen)
        !           230:                {
        !           231:                        if (rtype == INT)
        !           232:                        {
        !           233:                                if (rlen == 4)
        !           234:                                        i2toi4(tos);
        !           235:                                else if (slen == 4)
        !           236:                                                i4toi2(tos);
        !           237:                        }
        !           238:                        tos->len = rlen;        /* handles conversion to i1 or f4 */
        !           239:                }
        !           240:        }
        !           241: #      ifdef xOTR3
        !           242:        if (tTf(84, 6))
        !           243:        {
        !           244:                printf("RCVT rets: symbol: ");
        !           245:                prsym(tos);
        !           246:        }
        !           247: #      endif
        !           248: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.