|
|
1.1 ! root 1: /* flonum_copy.c - copy a flonum ! 2: Copyright (C) 1987 Free Software Foundation, Inc. ! 3: ! 4: This file is part of GAS, the GNU Assembler. ! 5: ! 6: GAS is free software; you can redistribute it and/or modify ! 7: it under the terms of the GNU General Public License as published by ! 8: the Free Software Foundation; either version 1, or (at your option) ! 9: any later version. ! 10: ! 11: GAS is distributed in the hope that it will be useful, ! 12: but WITHOUT ANY WARRANTY; without even the implied warranty of ! 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 14: GNU General Public License for more details. ! 15: ! 16: You should have received a copy of the GNU General Public License ! 17: along with GAS; see the file COPYING. If not, write to ! 18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ ! 19: ! 20: #include <string.h> ! 21: #include "flonum.h" ! 22: ! 23: void ! 24: flonum_copy( ! 25: FLONUM_TYPE *in, ! 26: FLONUM_TYPE *out) ! 27: { ! 28: int in_length; /* 0 origin */ ! 29: int out_length; /* 0 origin */ ! 30: ! 31: out -> sign = in -> sign; ! 32: in_length = in -> leader - in -> low; ! 33: if (in_length < 0) ! 34: { ! 35: out -> leader = out -> low - 1; /* 0.0 case */ ! 36: } ! 37: else ! 38: { ! 39: out_length = out -> high - out -> low; ! 40: /* ! 41: * Assume no GAPS in packing of littlenums. ! 42: * I.e. sizeof(array) == sizeof(element) * number_of_elements. ! 43: */ ! 44: if (in_length <= out_length) ! 45: { ! 46: { ! 47: /* ! 48: * For defensive programming, zero any high-order littlenums we don't need. ! 49: * This is destroying evidence and wasting time, so why bother??? ! 50: */ ! 51: if (in_length < out_length) ! 52: { ! 53: memset((char *)(out->low + in_length + 1), '\0', ! 54: out_length - in_length); ! 55: } ! 56: } ! 57: memcpy((char *)(out->low), (char *)(in->low), ! 58: (int)((in_length + 1) * sizeof(LITTLENUM_TYPE))); ! 59: out -> exponent = in -> exponent; ! 60: out -> leader = in -> leader - in -> low + out -> low; ! 61: } ! 62: else ! 63: { ! 64: int shorten; /* 1-origin. Number of littlenums we drop. */ ! 65: ! 66: shorten = in_length - out_length; ! 67: /* Assume out_length >= 0 ! */ ! 68: memcpy((char *)(out->low), (char *)(in->low + shorten), ! 69: (int)((out_length + 1) * sizeof(LITTLENUM_TYPE))); ! 70: out -> leader = out -> high; ! 71: out -> exponent = in -> exponent + shorten; ! 72: } ! 73: } /* if any significant bits */ ! 74: } ! 75: ! 76: /* end: flonum_copy.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.