#include <mem.h>

typedef unsigned real[3];

struct d_b {  /*structure of a double (bits parsed for transferring
                 data from a pascal real */
      unsigned int mant7 : 13; /*least signif. part of the mantissa*/
      unsigned int mant6 : 3;
      unsigned int mant5 : 13;
      unsigned int mant4 : 3;
      unsigned int mant3 :13;
      unsigned int mant2 : 3;
      unsigned int mant1 : 4; /*most signif. part of the mantissa*/
      unsigned int exp : 11;
      unsigned int sign : 1;
            };

struct r_i {  /*structure of a real (bits parsed for transferring
                 data to a double */
      unsigned int exp : 8;
      unsigned int mant6 : 3;
      unsigned int mant5 :13;
      unsigned int mant4 : 3;
      unsigned int mant3 :13;
      unsigned int mant2 : 3;
      unsigned int mant1 : 4; /*most significant part of mantissa*/
      unsigned int sign : 1;
           };

union r_i_o {                 /*pascal real number input to inp*/
             real inp;       /*parsed bits transferred out as xfr */
             struct r_i xfr;
             };

union d_i_o {                /*bits transferred in to inp*/
       struct d_b  inp;      /*double read out as outp*/
       double  outp;
      };

double real_double(real real_no)
{
  union r_i_o r;
  union d_i_o d;
  int i;
  for (i=0;i<3;i++) r.inp[i]=real_no[i];/*move real_no into transfer */
                                        /*    structure */
  d.inp.exp  = r.xfr.exp  + 894;        /*transfer data from pascal    */
  d.inp.sign = r.xfr.sign ;             /*    structure to double      */
  d.inp.mant1= r.xfr.mant1;             /*    structure                */
  d.inp.mant2= r.xfr.mant2;
  d.inp.mant3= r.xfr.mant3;
  d.inp.mant4= r.xfr.mant4;
  d.inp.mant5= r.xfr.mant5;
  d.inp.mant6= r.xfr.mant6;
  d.inp.mant7= 0;
  return d.outp;                        /*return result from double*/
                                        /*structure*/
}


void double_real(real *real_no,double doub_no)
{
  union r_i_o r;
  union d_i_o d;
  int i;

  d.outp=doub_no;
  r.xfr.exp   = d.inp.exp-894;
  r.xfr.sign  = d.inp.sign;
  r.xfr.mant1 = d.inp.mant1;
  r.xfr.mant2 = d.inp.mant2;
  r.xfr.mant3 = d.inp.mant3;
  r.xfr.mant4 = d.inp.mant4;
  r.xfr.mant5 = d.inp.mant5;
  r.xfr.mant6 = d.inp.mant6;

  memcpy(*real_no,r.inp,sizeof(real));
}
