Return to num2long.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / bcmath / libbcmath / src |
1.1 misho 1: /* num2long.c: bcmath library file. */ 2: /* 3: Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. 4: Copyright (C) 2000 Philip A. Nelson 5: 6: This library is free software; you can redistribute it and/or 7: modify it under the terms of the GNU Lesser General Public 8: License as published by the Free Software Foundation; either 9: version 2 of the License, or (at your option) any later version. 10: 11: This library 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 GNU 14: Lesser General Public License for more details. (COPYING.LIB) 15: 16: You should have received a copy of the GNU Lesser General Public 17: License along with this library; if not, write to: 18: 19: The Free Software Foundation, Inc. 20: 59 Temple Place, Suite 330 21: Boston, MA 02111-1307 USA. 22: 23: You may contact the author by: 24: e-mail: philnelson@acm.org 25: us-mail: Philip A. Nelson 26: Computer Science Department, 9062 27: Western Washington University 28: Bellingham, WA 98226-9062 29: 30: *************************************************************************/ 31: 32: #include <config.h> 33: #include <stdio.h> 34: #include <assert.h> 35: #include <stdlib.h> 36: #include <ctype.h> 37: #include <stdarg.h> 38: #include "bcmath.h" 39: #include "private.h" 40: 41: /* Convert a number NUM to a long. The function returns only the integer 42: part of the number. For numbers that are too large to represent as 43: a long, this function returns a zero. This can be detected by checking 44: the NUM for zero after having a zero returned. */ 45: 46: long 47: bc_num2long (num) 48: bc_num num; 49: { 50: long val; 51: char *nptr; 52: int index; 53: 54: /* Extract the int value, ignore the fraction. */ 55: val = 0; 56: nptr = num->n_value; 57: for (index=num->n_len; (index>0) && (val<=(LONG_MAX/BASE)); index--) 58: val = val*BASE + *nptr++; 59: 60: /* Check for overflow. If overflow, return zero. */ 61: if (index>0) val = 0; 62: if (val < 0) val = 0; 63: 64: /* Return the value. */ 65: if (num->n_sign == PLUS) 66: return (val); 67: else 68: return (-val); 69: } 70: