|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.