From: Daniela Mariaschi Date: Mon, 2 Jun 2003 12:59:20 +0000 (+0000) Subject: MFH: Fixed numeric/decimal +/-(x,y) +/-(x,0) X-Git-Tag: php-4.3.3RC1~119 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=54826378765f6daece9a44029e176a4e24401ee5;p=php MFH: Fixed numeric/decimal +/-(x,y) +/-(x,0) for all platforms --- diff --git a/ext/interbase/interbase.c b/ext/interbase/interbase.c index 328aa655ed..a3119ef3a6 100644 --- a/ext/interbase/interbase.c +++ b/ext/interbase/interbase.c @@ -18,7 +18,7 @@ */ /* $Id$ */ - + /* TODO: Arrays, roles? A lot... */ @@ -1780,25 +1780,36 @@ static int _php_ibase_var_pval(pval *val, void *data, int type, int len, int sca Z_STRLEN_P(val) = len; break; case SQL_LONG: + case SQL_SHORT: if (scale) { - int j, f = 1; - float n = (float) *(long *)(data); - + short j ; + long n, f = 1; + if ( (type & ~1) == SQL_SHORT) { + n = (long) *(short *) (data); + }else { + n = (long) *(long *) (data); + } for (j = 0; j < -scale; j++) { f *= 10; } + if (n >= 0){ + Z_STRLEN_P(val) = sprintf (string_data, "%ld.%0*ld", n / f, -scale, n % f ); + }else if ((n/f) != 0 ){ + Z_STRLEN_P(val) = sprintf (string_data, "%ld.%0*ld", n / f, -scale, -(n % f) ); + }else{ + Z_STRLEN_P(val) = sprintf (string_data, "%s.%0*ld","-0", -scale, -(n % f) ); + } Z_TYPE_P(val) = IS_STRING; - Z_STRLEN_P(val) = sprintf(string_data, "%.*f", -scale, n / f); Z_STRVAL_P(val) = estrdup(string_data); } else { Z_TYPE_P(val) = IS_LONG; - Z_LVAL_P(val) = *(long *)(data); + if ( (type & ~1) == SQL_SHORT) { + Z_LVAL_P(val) = *(short *) (data); + }else{ + Z_LVAL_P(val) = *(long *) (data); + } } break; - case SQL_SHORT: - Z_TYPE_P(val) = IS_LONG; - Z_LVAL_P(val) = *(short *)(data); - break; case SQL_FLOAT: Z_TYPE_P(val) = IS_DOUBLE; Z_DVAL_P(val) = *(float *)(data); @@ -1808,9 +1819,7 @@ static int _php_ibase_var_pval(pval *val, void *data, int type, int len, int sca Z_TYPE_P(val) = IS_STRING; Z_STRLEN_P(val) = sprintf(string_data, "%.*f", -scale, *(double *)data); Z_STRVAL_P(val) = estrdup(string_data); - /* - Z_STRVAL_P(val) = string_data; - */ + } else { Z_TYPE_P(val) = IS_DOUBLE; Z_DVAL_P(val) = *(double *)data; @@ -1818,23 +1827,30 @@ static int _php_ibase_var_pval(pval *val, void *data, int type, int len, int sca break; #ifdef SQL_INT64 case SQL_INT64: - val->type = IS_STRING; - - if (scale) { - int j, f = 1; - double number = (double) ((ISC_INT64) (*((ISC_INT64 *)data))); - char dt[20]; + Z_TYPE_P(val) = IS_STRING; + if (scale < 0 ){ + short j = 0; + ISC_INT64 f = 1; + ISC_INT64 n = (ISC_INT64) *(ISC_INT64 *) data; for (j = 0; j < -scale; j++) { f *= 10; } - sprintf(dt, "%%0.%df", -scale); - val->value.str.len = sprintf (string_data, dt, number/f ); + if (n >= 0){ + Z_STRLEN_P(val) = sprintf (string_data, "%" ISC_INT64_FORMAT "d.%0*" ISC_INT64_FORMAT "d", + (ISC_INT64) n / f, -scale, (ISC_INT64) n % f ); + }else if ((n/f) != 0 ){ + Z_STRLEN_P(val) = sprintf (string_data, "%" ISC_INT64_FORMAT "d.%0*" ISC_INT64_FORMAT "d", + (ISC_INT64) n / f, -scale, (ISC_INT64) -(n % f) ); + }else{ + Z_STRLEN_P(val) = sprintf (string_data, "%s.%0*" ISC_INT64_FORMAT "d", + "-0", -scale, (ISC_INT64) -(n % f) ); + } } else { - val->value.str.len =sprintf (string_data, "%.0" ISC_INT64_FORMAT "d", + Z_STRLEN_P(val) =sprintf (string_data, "%.0" ISC_INT64_FORMAT "d", (ISC_INT64) *(ISC_INT64 *) data); } - val->value.str.val = estrdup(string_data); + Z_STRVAL_P(val) = estrdup(string_data); break; #endif #ifndef SQL_TIMESTAMP diff --git a/ext/interbase/tests/003.phpt b/ext/interbase/tests/003.phpt index dbd1cec92b..341be8e310 100644 --- a/ext/interbase/tests/003.phpt +++ b/ext/interbase/tests/003.phpt @@ -8,7 +8,6 @@ InterBase: misc sql types (may take a while) V_CHAR,0,strlen($v_char)) != $v_char){ @@ -57,11 +63,37 @@ InterBase: misc sql types (may take a while) echo " in: $v_date\n"; echo " out: $row->V_DATE\n"; } - if($row->V_DECIMAL != $v_decimal){ - echo " DECIMAL fail\n"; - echo " in: $v_decimal\n"; - echo " out: $row->V_DECIMAL\n"; + if($row->V_DECIMAL4_2 != $v_decimal4_2){ + echo " DECIMAL4_2 fail\n"; + echo " in: $v_decimal4_2\n"; + echo " out: $row->V_DECIMAL4_2\n"; + } + if($row->V_DECIMAL4_0 != $v_decimal4_0){ + echo " DECIMAL4_0 fail\n"; + echo " in: $v_decimal4_0\n"; + echo " out: $row->V_DECIMAL4_0\n"; + } + if($row->V_DECIMAL7_2 != $v_decimal7_2){ + echo " DECIMAL7_2 fail\n"; + echo " in: $v_decimal7_2\n"; + echo " out: $row->V_DECIMAL7_2\n"; + } + if($row->V_DECIMAL7_0 != $v_decimal7_0){ + echo " DECIMAL7_0 fail\n"; + echo " in: $v_decimal7_0\n"; + echo " out: $row->V_DECIMAL7_0\n"; } + if($row->V_NUMERIC15_15 != $v_numeric15_15){ + echo " NUMERIC15_15 fail\n"; + echo " in: $v_numeric15_15\n"; + echo " out: $row->V_NUMERIC15_15\n"; + } + if($row->V_NUMERIC15_0 != $v_numeric15_0){ + echo " NUMERIC15_0 fail\n"; + echo " in: $v_numeric15_0\n"; + echo " out: $row->V_NUMERIC15_0\n"; + } + if(abs($row->V_DOUBLE - $v_double) > abs($v_double / 1E15)){ echo " DOUBLE fail\n"; echo " in: $v_double\n"; @@ -77,6 +109,18 @@ InterBase: misc sql types (may take a while) echo " in: $v_integer\n"; echo " out: $row->V_INTEGER\n"; } + if($row->V_SMALLINT != $v_smallint){ + echo " SMALLINT fail\n"; + echo " in: $v_smallint\n"; + echo " out: $row->V_SMALLINT\n"; + } + + if(substr($row->V_VARCHAR,0,strlen($v_varchar)) != $v_varchar){ + echo " VARCHAR fail:\n"; + echo " in: $v_varchar\n"; + echo " out: $row->V_VARCHAR\n"; + } + ibase_free_result($sel); } /* for($iter) */