1: # include   <ingres.h>
   2: # include   <symbol.h>
   3: # include   <sccs.h>
   4: 
   5: SCCSID(@(#)convert.c	8.2	1/16/85)
   6: 
   7: /*
   8: **	convert  converts  numeric values of one type and length
   9: **	to a different type and length.
  10: **
  11: **	The source numeric can be i1,i2,i4,f4,or f8.
  12: **	The source number will be converted to the
  13: **	type and length specified in the destination.
  14: **	It also  must be one of i1,i2,i4,f4, or f8.
  15: **
  16: **	convert returns 0 is no overflow occured,
  17: **	  else it returns -1
  18: */
  19: 
  20: convert(inp, outp, sf, slen, df, dlen)
  21: char    *inp;   /* pointer to input */
  22: char    *outp;  /* pointer to the output area */
  23: int sf; /* format of the source number */
  24: int slen;   /* length of the source number */
  25: int df; /* format of the dest */
  26: int dlen;   /* length of the dest */
  27: {
  28:     union anytype   number;
  29:     register union anytype  *num;
  30:     register int    sl;
  31:     register int    dl;
  32: 
  33:     dl = dlen;
  34:     sl = slen;
  35:     num = &number;
  36:     bmove(inp, num, sl);    /* copy number into buffer */
  37: 
  38:     if (sf != df)
  39:     {
  40:         /* if the source and destination formats are
  41: 		   different then the source must be converted
  42: 		   to i4 if the dest is int, otherwise to f8 */
  43: 
  44:         if (df == FLOAT)
  45:         {
  46:             switch (sl)
  47:             {
  48: 
  49:               case 1:
  50:                 num->f8type = num->i1type;  /* i1 to f8 */
  51:                 break;
  52: 
  53:               case 2:
  54:                 num->f8type = num->i2type;  /* i2 to f8 */
  55:                 break;
  56: 
  57:               case 4:
  58:                 num->f8type = num->i4type;  /* i4 to f8 */
  59:             }
  60:         sl = 8;
  61:         }
  62:         else
  63:         {
  64:             /* check if float >  2**31 */
  65:             if (sl == 8)
  66:                 num->f4type = num->f8type;  /* f8 to f4 */
  67: 
  68:             if (num->f4type > MAXF4 | num->f4type < MINF4 )
  69:                 return (-1);
  70:             num->i4type = num->f4type;  /* f4 to i4 */
  71:             sl = 4;
  72:         }
  73:     }
  74: 
  75:     /* source is now the same type as destination */
  76:     /* convert lengths to match */
  77: 
  78:     if (sl != dl)
  79:     {
  80:         /* lengths don't match. convert. */
  81:         if (df == FLOAT)
  82:         {
  83:             if (dl == 8)
  84:                 num->f8type = num->f4type;  /* f4 to f8 */
  85:             else
  86:                 num->f4type = num->f8type;  /* f8 to f4 with rounding */
  87:         }
  88:         else
  89:         {
  90:             switch (dl)
  91:             {
  92: 
  93:               case 1:
  94:                 if (sl == 2)
  95:                 {
  96:                     if (num->i2type > MAXI2 | num->i2type < MINI2)
  97:                         return (-1);
  98:                     num->i1type = num->i2type;  /* i2 to i1 */
  99:                 }
 100:                 else
 101:                 {
 102:                     if (num->i4type > MAXI2 | num->i4type < MINI2)
 103:                         return (-1);
 104:                     num->i1type = num->i4type;  /* i4 to i1 */
 105:                 }
 106:                 break;
 107: 
 108:               case 2:
 109:                 if (sl == 1)
 110:                 {
 111:                     num->i2type = num->i1type;  /* i1 to i2 */
 112:                 }
 113:                 else
 114:                 {
 115:                     if (num->i4type > MAXI4 | num->i4type < MINI4)
 116:                         return (-1);
 117:                     num->i2type = num->i4type;  /* i4 to i2 */
 118:                 }
 119:                 break;
 120: 
 121:               case 4:
 122:                 if (sl == 1)
 123:                     num->i4type = num->i1type;  /* i1 to i4 */
 124:                 else
 125:                     num->i4type = num->i2type;  /* i2 to i4 */
 126:             }
 127:         }
 128:     }
 129: 
 130:     /* conversion is complete */
 131:     /* copy the result into outp */
 132: 
 133:     bmove(num, outp, dl);
 134:     return (0);
 135: }

Defined functions

convert defined in line 5; used 1 times
Last modified: 1986-04-17
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 731
Valid CSS Valid XHTML 1.0 Strict