Return to str2num.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / bcmath / libbcmath / src |
1.1 misho 1: /* str2num.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 strings to bc numbers. Base 10 only.*/ 42: 43: void 44: bc_str2num (bc_num *num, char *str, int scale TSRMLS_DC) 45: { 46: int digits, strscale; 47: char *ptr, *nptr; 48: char zero_int; 49: 50: /* Prepare num. */ 51: bc_free_num (num); 52: 53: /* Check for valid number and count digits. */ 54: ptr = str; 55: digits = 0; 56: strscale = 0; 57: zero_int = FALSE; 58: if ( (*ptr == '+') || (*ptr == '-')) ptr++; /* Sign */ 59: while (*ptr == '0') ptr++; /* Skip leading zeros. */ 60: while (isdigit((int)*ptr)) ptr++, digits++; /* digits */ 61: if (*ptr == '.') ptr++; /* decimal point */ 62: while (isdigit((int)*ptr)) ptr++, strscale++; /* digits */ 63: if ((*ptr != '\0') || (digits+strscale == 0)) 64: { 65: *num = bc_copy_num (BCG(_zero_)); 66: return; 67: } 68: 69: /* Adjust numbers and allocate storage and initialize fields. */ 70: strscale = MIN(strscale, scale); 71: if (digits == 0) 72: { 73: zero_int = TRUE; 74: digits = 1; 75: } 76: *num = bc_new_num (digits, strscale); 77: 78: /* Build the whole number. */ 79: ptr = str; 80: if (*ptr == '-') 81: { 82: (*num)->n_sign = MINUS; 83: ptr++; 84: } 85: else 86: { 87: (*num)->n_sign = PLUS; 88: if (*ptr == '+') ptr++; 89: } 90: while (*ptr == '0') ptr++; /* Skip leading zeros. */ 91: nptr = (*num)->n_value; 92: if (zero_int) 93: { 94: *nptr++ = 0; 95: digits = 0; 96: } 97: for (;digits > 0; digits--) 98: *nptr++ = CH_VAL(*ptr++); 99: 100: 101: /* Build the fractional part. */ 102: if (strscale > 0) 103: { 104: ptr++; /* skip the decimal point! */ 105: for (;strscale > 0; strscale--) 106: *nptr++ = CH_VAL(*ptr++); 107: } 108: } 109: