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