register XDR *xdrs; double *dp;
XDR *xdrs; double *dp;
xdr_double(xdrs, dp)	register XDR *xdrs;	double *dp;{#ifdef vax	struct	ieee_double id;	struct	vax_double vd;	register struct dbl_limits *lim;	int i;#endif	switch (xdrs->x_op) {	case XDR_ENCODE:#ifdef vax		vd = *((struct vax_double *)dp);		for (i = 0, lim = dbl_limits;			i < sizeof(dbl_limits)/sizeof(struct dbl_limits);			i++, lim++) {			if ((vd.mantissa4 == lim->d.mantissa4) &&				(vd.mantissa3 == lim->d.mantissa3) &&				(vd.mantissa2 == lim->d.mantissa2) &&				(vd.mantissa1 == lim->d.mantissa1) &&				(vd.exp == lim->d.exp)) {				id = lim->ieee;				goto shipit;			}		}		id.exp = vd.exp - VAX_DBL_BIAS + IEEE_DBL_BIAS;		id.mantissa1 = (vd.mantissa1 << 13) | (vd.mantissa2 >> 3);		id.mantissa2 = ((vd.mantissa2 & MASK(3)) << 29) |				(vd.mantissa3 << 13) |				((vd.mantissa4 >> 3) & MASK(13));	shipit:		id.sign = vd.sign;		dp = (double *)&id;#endif		if (2*sizeof(long) == sizeof(double)) {			long *lp = (long *)dp;			return (XDR_PUTLONG(xdrs, lp+!LSW) &&				XDR_PUTLONG(xdrs, lp+LSW));		} else if (2*sizeof(int) == sizeof(double)) {			int *ip = (int *)dp;			long tmp[2];			tmp[0] = ip[!LSW];			tmp[1] = ip[LSW];			return (XDR_PUTLONG(xdrs, tmp) &&				XDR_PUTLONG(xdrs, tmp+1));		}		break;	case XDR_DECODE:#ifdef vax		lp = (long *)&id;		if (!XDR_GETLONG(xdrs, lp++) || !XDR_GETLONG(xdrs, lp))			return (FALSE);		for (i = 0, lim = dbl_limits;			i < sizeof(dbl_limits)/sizeof(struct dbl_limits);			i++, lim++) {			if ((id.mantissa2 == lim->ieee.mantissa2) &&				(id.mantissa1 == lim->ieee.mantissa1) &&				(id.exp == lim->ieee.exp)) {				vd = lim->d;				goto doneit;			}		}		vd.exp = id.exp - IEEE_DBL_BIAS + VAX_DBL_BIAS;		vd.mantissa1 = (id.mantissa1 >> 13);		vd.mantissa2 = ((id.mantissa1 & MASK(13)) << 3) |				(id.mantissa2 >> 29);		vd.mantissa3 = (id.mantissa2 >> 13);		vd.mantissa4 = (id.mantissa2 << 3);	doneit:		vd.sign = id.sign;		*dp = *((double *)&vd);		return (TRUE);#else		if (2*sizeof(long) == sizeof(double)) {			long *lp = (long *)dp;			return (XDR_GETLONG(xdrs, lp+!LSW) &&				XDR_GETLONG(xdrs, lp+LSW));		} else if (2*sizeof(int) == sizeof(double)) {			int *ip = (int *)dp;			long tmp[2];			if (XDR_GETLONG(xdrs, tmp+!LSW) &&			    XDR_GETLONG(xdrs, tmp+LSW)) {				ip[0] = tmp[0];				ip[1] = tmp[1];				return (TRUE);			}		}		break;#endif	case XDR_FREE:		return (TRUE);	}	return (FALSE);}