Annotation of 43BSDTahoe/new/sunrpc/xdr_float.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
        !             3:  * unrestricted use provided that this legend is included on all tape
        !             4:  * media and as a part of the software program in whole or part.  Users
        !             5:  * may copy or modify Sun RPC without charge, but are not authorized
        !             6:  * to license or distribute it to anyone else except as part of a product or
        !             7:  * program developed by the user.
        !             8:  * 
        !             9:  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
        !            10:  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
        !            11:  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
        !            12:  * 
        !            13:  * Sun RPC is provided with no support and without any obligation on the
        !            14:  * part of Sun Microsystems, Inc. to assist in its use, correction,
        !            15:  * modification or enhancement.
        !            16:  * 
        !            17:  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
        !            18:  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
        !            19:  * OR ANY PART THEREOF.
        !            20:  * 
        !            21:  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
        !            22:  * or profits or other special, indirect and consequential damages, even if
        !            23:  * Sun has been advised of the possibility of such damages.
        !            24:  * 
        !            25:  * Sun Microsystems, Inc.
        !            26:  * 2550 Garcia Avenue
        !            27:  * Mountain View, California  94043
        !            28:  */
        !            29: #ifndef lint
        !            30: static char sccsid[] = "@(#)xdr_float.c 1.2 85/03/14 Copyr 1984 Sun Micro";
        !            31: #endif
        !            32: 
        !            33: /*
        !            34:  * xdr_float.c, Generic XDR routines impelmentation.
        !            35:  *
        !            36:  * Copyright (C) 1984, Sun Microsystems, Inc.
        !            37:  *
        !            38:  * These are the "floating point" xdr routines used to (de)serialize
        !            39:  * most common data items.  See xdr.h for more info on the interface to
        !            40:  * xdr.
        !            41:  */
        !            42: 
        !            43: #include "types.h"
        !            44: #include "xdr.h"
        !            45: #include <stdio.h>
        !            46: 
        !            47: /*
        !            48:  * NB: Not portable.
        !            49:  * This routine works on Suns (Sky / 68000's) and Vaxen.
        !            50:  */
        !            51:    
        !            52: /* What IEEE single precision floating point looks like on a Vax */
        !            53: struct  ieee_single {
        !            54:        unsigned int    mantissa: 23;
        !            55:        unsigned int    exp     : 8;
        !            56:        unsigned int    sign    : 1;
        !            57: };
        !            58: 
        !            59: /* Vax single precision floating point */
        !            60: struct  vax_single {
        !            61:        unsigned int    mantissa1 : 7;
        !            62:        unsigned int    exp       : 8;
        !            63:        unsigned int    sign      : 1;
        !            64:        unsigned int    mantissa2 : 16;
        !            65:                
        !            66: };
        !            67: 
        !            68: #define VAX_SNG_BIAS    0x81
        !            69: #define IEEE_SNG_BIAS   0x7f
        !            70:  
        !            71: static struct sgl_limits {
        !            72:        struct vax_single s;
        !            73:        struct ieee_single ieee;
        !            74: } sgl_limits[2] = {
        !            75:        {{ 0x3f, 0xff, 0x0, 0xffff },   /* Max Vax */
        !            76:        { 0x0, 0xff, 0x0 }},            /* Max IEEE */
        !            77:        {{ 0x0, 0x0, 0x0, 0x0 },        /* Min Vax */
        !            78:        { 0x0, 0x0, 0x0 }}              /* Min IEEE */
        !            79: };
        !            80: 
        !            81: bool_t 
        !            82: xdr_float(xdrs, fp)
        !            83:        register XDR *xdrs;
        !            84:        register float *fp;
        !            85: {
        !            86:        struct ieee_single is;
        !            87:        struct vax_single vs, *vsp;
        !            88:        struct sgl_limits *lim;
        !            89:        int i;
        !            90: 
        !            91:        switch (xdrs->x_op) {
        !            92: 
        !            93:        case XDR_ENCODE:
        !            94: #ifdef mc68000
        !            95:                return (XDR_PUTLONG(xdrs, (long *)fp));
        !            96: #else
        !            97:                vs = *((struct vax_single *)fp);
        !            98:                for (i = 0, lim = sgl_limits;
        !            99:                        i < sizeof(sgl_limits)/sizeof(struct sgl_limits);
        !           100:                        i++, lim++) {
        !           101:                        if ((vs.mantissa2 == lim->s.mantissa2) &&
        !           102:                                (vs.exp == lim->s.exp) &&
        !           103:                                (vs.mantissa1 == lim->s.mantissa1)) {
        !           104:                                is = lim->ieee;
        !           105:                                goto shipit;
        !           106:                        }
        !           107:                }
        !           108:                is.exp = vs.exp - VAX_SNG_BIAS + IEEE_SNG_BIAS;
        !           109:                is.mantissa = (vs.mantissa1 << 16) | vs.mantissa2;
        !           110:        shipit:
        !           111:                is.sign = vs.sign;
        !           112:                return (XDR_PUTLONG(xdrs, (long *)&is));
        !           113: #endif
        !           114: 
        !           115:        case XDR_DECODE:
        !           116: #ifdef mc68000
        !           117:                return (XDR_GETLONG(xdrs, (long *)fp));
        !           118: #else
        !           119:                vsp = (struct vax_single *)fp;
        !           120:                if (!XDR_GETLONG(xdrs, (long *)&is))
        !           121:                        return (FALSE);
        !           122:                for (i = 0, lim = sgl_limits;
        !           123:                        i < sizeof(sgl_limits)/sizeof(struct sgl_limits);
        !           124:                        i++, lim++) {
        !           125:                        if ((is.exp == lim->ieee.exp) &&
        !           126:                                (is.mantissa = lim->ieee.mantissa)) {
        !           127:                                *vsp = lim->s;
        !           128:                                goto doneit;
        !           129:                        }
        !           130:                }
        !           131:                vsp->exp = is.exp - IEEE_SNG_BIAS + VAX_SNG_BIAS;
        !           132:                vsp->mantissa2 = is.mantissa;
        !           133:                vsp->mantissa1 = (is.mantissa >> 16);
        !           134:        doneit:
        !           135:                vsp->sign = is.sign;
        !           136:                return (TRUE);
        !           137: #endif
        !           138: 
        !           139:        case XDR_FREE:
        !           140:                return (TRUE);
        !           141:        }
        !           142:        return (FALSE);
        !           143: }
        !           144: 
        !           145: /*
        !           146:  * This routine works on Suns (Sky / 68000's) and Vaxen.
        !           147:  */
        !           148: 
        !           149: /* What IEEE double precision floating point looks like on a Vax */
        !           150: struct  ieee_double {
        !           151:        unsigned int    mantissa1 : 20;
        !           152:        unsigned int    exp       : 11;
        !           153:        unsigned int    sign      : 1;
        !           154:        unsigned int    mantissa2 : 32;
        !           155: };
        !           156:  
        !           157: /* Vax double precision floating point */
        !           158: struct  vax_double {
        !           159:        unsigned int    mantissa1 : 7;
        !           160:        unsigned int    exp       : 8;
        !           161:        unsigned int    sign      : 1;
        !           162:        unsigned int    mantissa2 : 16;
        !           163:        unsigned int    mantissa3 : 16;
        !           164:        unsigned int    mantissa4 : 16;
        !           165: };
        !           166: 
        !           167: #define VAX_DBL_BIAS    0x81
        !           168: #define IEEE_DBL_BIAS   0x3ff
        !           169: #define MASK(nbits)     ((1 << nbits) - 1)
        !           170: 
        !           171: static struct dbl_limits {
        !           172:        struct  vax_double d;
        !           173:        struct  ieee_double ieee;
        !           174: } dbl_limits[2] = {
        !           175:        {{ 0x7f, 0xff, 0x0, 0xffff, 0xffff, 0xffff },   /* Max Vax */
        !           176:        { 0x0, 0x7ff, 0x0, 0x0 }},                      /* Max IEEE */
        !           177:        {{ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},               /* Min Vax */
        !           178:        { 0x0, 0x0, 0x0, 0x0 }}                         /* Min IEEE */
        !           179: };
        !           180: 
        !           181: bool_t           
        !           182: xdr_double(xdrs, dp)
        !           183:        register XDR *xdrs;
        !           184:        double *dp;
        !           185: {
        !           186:        register long *lp;
        !           187:        struct  ieee_double id;
        !           188:        struct  vax_double vd;
        !           189:        register struct dbl_limits *lim;
        !           190:        int i;
        !           191: 
        !           192:        switch (xdrs->x_op) {
        !           193: 
        !           194:        case XDR_ENCODE:
        !           195: #ifdef mc68000
        !           196:                lp = (long *)dp;
        !           197: #else
        !           198:                vd = *((struct  vax_double *)dp);
        !           199:                for (i = 0, lim = dbl_limits;
        !           200:                        i < sizeof(dbl_limits)/sizeof(struct dbl_limits);
        !           201:                        i++, lim++) {
        !           202:                        if ((vd.mantissa4 == lim->d.mantissa4) &&
        !           203:                                (vd.mantissa3 == lim->d.mantissa3) &&
        !           204:                                (vd.mantissa2 == lim->d.mantissa2) &&
        !           205:                                (vd.mantissa1 == lim->d.mantissa1) &&
        !           206:                                (vd.exp == lim->d.exp)) {
        !           207:                                id = lim->ieee;
        !           208:                                goto shipit;
        !           209:                        }
        !           210:                }
        !           211:                id.exp = vd.exp - VAX_DBL_BIAS + IEEE_DBL_BIAS;
        !           212:                id.mantissa1 = (vd.mantissa1 << 13) | (vd.mantissa2 >> 3);
        !           213:                id.mantissa2 = ((vd.mantissa2 & MASK(3)) << 29) |
        !           214:                                (vd.mantissa3 << 13) |
        !           215:                                ((vd.mantissa4 >> 3) & MASK(13));
        !           216:        shipit:
        !           217:                id.sign = vd.sign;
        !           218:                lp = (long *)&id;
        !           219: #endif
        !           220:                return (XDR_PUTLONG(xdrs, lp++) && XDR_PUTLONG(xdrs, lp));
        !           221: 
        !           222:        case XDR_DECODE:
        !           223: #ifdef mc68000
        !           224:                lp = (long *)dp;
        !           225:                return (XDR_GETLONG(xdrs, lp++) && XDR_GETLONG(xdrs, lp));
        !           226: #else
        !           227:                lp = (long *)&id;
        !           228:                if (!XDR_GETLONG(xdrs, lp++) || !XDR_GETLONG(xdrs, lp))
        !           229:                        return (FALSE);
        !           230:                for (i = 0, lim = dbl_limits;
        !           231:                        i < sizeof(dbl_limits)/sizeof(struct dbl_limits);
        !           232:                        i++, lim++) {
        !           233:                        if ((id.mantissa2 == lim->ieee.mantissa2) &&
        !           234:                                (id.mantissa1 == lim->ieee.mantissa1) &&
        !           235:                                (id.exp == lim->ieee.exp)) {
        !           236:                                vd = lim->d;
        !           237:                                goto doneit;
        !           238:                        }
        !           239:                }
        !           240:                vd.exp = id.exp - IEEE_DBL_BIAS + VAX_DBL_BIAS;
        !           241:                vd.mantissa1 = (id.mantissa1 >> 13);
        !           242:                vd.mantissa2 = ((id.mantissa1 & MASK(13)) << 3) |
        !           243:                                (id.mantissa2 >> 29);
        !           244:                vd.mantissa3 = (id.mantissa2 >> 13);
        !           245:                vd.mantissa4 = (id.mantissa2 << 3);
        !           246:        doneit:
        !           247:                vd.sign = id.sign;
        !           248:                *dp = *((double *)&vd);
        !           249:                return (TRUE);
        !           250: #endif
        !           251: 
        !           252:        case XDR_FREE:
        !           253:                return (TRUE);
        !           254:        }
        !           255:        return (FALSE);
        !           256: }

unix.superglobalmegacorp.com

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