Annotation of 42BSD/ucb/pascal/src/sconv.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1983 Regents of the University of California */
                      2: 
                      3: static char sccsid[] = "@(#)sconv.c 1.2 2/1/83";
                      4: 
                      5:     /*
                      6:      * functions to help pi put out
                      7:      * polish postfix binary portable c compiler intermediate code
                      8:      * thereby becoming the portable pascal compiler
                      9:      */
                     10: 
                     11: #include       "whoami.h"
                     12: #ifdef PC
                     13: #include       "0.h"
                     14: #include       "pcops.h"
                     15: 
                     16:     /*
                     17:      * this routine enforces ``the usual arithmetic conversions''
                     18:      * all integral operands are converted to ints.
                     19:      * if either operand is a double, both are made to be double.
                     20:      * this routine takes struct nl *'s for the types,
                     21:      * and returns both the struct nl * and the p2type for the result.
                     22:      */
                     23: tuac(thistype, thattype, resulttypep, resultp2typep)
                     24:     struct nl  *thistype;
                     25:     struct nl  *thattype;
                     26:     struct nl  **resulttypep;
                     27:     int                *resultp2typep;
                     28: {
                     29:     int                thisp2type = p2type(thistype);
                     30:     int                thatp2type = p2type(thattype);
                     31: 
                     32:     *resulttypep = thistype;
                     33:     *resultp2typep = thisp2type;
                     34:        /*
                     35:         *      should only be passed scalars
                     36:         */
                     37:     if (isnta(thistype,"sbcid") || isnta(thattype,"sbcid")) {
                     38:        return;
                     39:     }
                     40:     if (thisp2type == P2CHAR || thisp2type == P2SHORT) {
                     41:        *resultp2typep = P2INT;
                     42:        *resulttypep = nl + T4INT;
                     43:     }
                     44:     if (*resultp2typep == P2INT && thatp2type == P2DOUBLE) {
                     45:        *resultp2typep = P2DOUBLE;
                     46:        *resulttypep = nl + TDOUBLE;
                     47:     }
                     48:     sconv(thisp2type, *resultp2typep);
                     49: }
                     50:     
                     51:     /*
                     52:      * this routine will emit sconv operators when it thinks they are needed.
                     53:      * this is code generator specific, rather than machine-specific.
                     54:      * this routine takes p2types for arguments, not struct nl *'s.
                     55:      */
                     56: #ifdef vax
                     57:     /*
                     58:      * the vax code genrator is very good, this routine is extremely boring.
                     59:      */
                     60: sconv(fromp2type, top2type)
                     61:     int        fromp2type;
                     62:     int        top2type;
                     63: {
                     64: 
                     65:     switch (top2type) {
                     66:        case P2CHAR:
                     67:        case P2SHORT:
                     68:        case P2INT:
                     69:            switch (fromp2type) {
                     70:                case P2CHAR:
                     71:                case P2SHORT:
                     72:                case P2INT:
                     73:                case P2DOUBLE:
                     74:                        return; /* pass1 knows how to do these */
                     75:                default:
                     76:                        return;
                     77:            }
                     78:        case P2DOUBLE:
                     79:            switch (fromp2type) {
                     80:                case P2CHAR:
                     81:                case P2SHORT:
                     82:                case P2INT:
                     83:                        putop(P2SCONV, P2DOUBLE);
                     84:                        return;
                     85:                case P2DOUBLE:
                     86:                        return;
                     87:                default:
                     88:                        return;
                     89:            }
                     90:        default:
                     91:                return;
                     92:     }
                     93: }
                     94: #endif vax
                     95: #ifdef mc68000
                     96:     /*
                     97:      * i don't know how much to trust the mc68000 compiler,
                     98:      * so this routine is full.
                     99:      */
                    100: sconv(fromp2type, top2type)
                    101:     int        fromp2type;
                    102:     int        top2type;
                    103: {
                    104: 
                    105:     switch (top2type) {
                    106:        case P2CHAR:
                    107:            switch (fromp2type) {
                    108:                case P2CHAR:
                    109:                        return;
                    110:                case P2SHORT:
                    111:                case P2INT:
                    112:                case P2DOUBLE:
                    113:                        putop(P2SCONV, P2CHAR);
                    114:                        return;
                    115:                default:
                    116:                        return;
                    117:            }
                    118:        case P2SHORT:
                    119:            switch (fromp2type) {
                    120:                case P2SHORT:
                    121:                        return;
                    122:                case P2CHAR:
                    123:                case P2INT:
                    124:                case P2DOUBLE:
                    125:                        putop(P2SCONV, P2SHORT);
                    126:                        return;
                    127:                default:
                    128:                        return;
                    129:            }
                    130:        case P2INT:
                    131:            switch (fromp2type) {
                    132:                case P2INT:
                    133:                        return;
                    134:                case P2CHAR:
                    135:                case P2SHORT:
                    136:                case P2DOUBLE:
                    137:                        putop(P2SCONV, P2INT);
                    138:                        return;
                    139:                default:
                    140:                        return;
                    141:            }
                    142:        case P2DOUBLE:
                    143:            switch (fromp2type) {
                    144:                case P2DOUBLE:
                    145:                        return;
                    146:                case P2CHAR:
                    147:                case P2SHORT:
                    148:                case P2INT:
                    149:                        putop(P2SCONV, P2DOUBLE);
                    150:                        return;
                    151:                default:
                    152:                        return;
                    153:            }
                    154:        default:
                    155:                return;
                    156:     }
                    157: }
                    158: #endif mc68000
                    159: #endif PC

unix.superglobalmegacorp.com

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