#ifdef ZEND_DVAL_TO_LVAL_USE_CAST /* Platforms where a plain cast works (VC6) */ # define zend_dval_to_lval(d) ((long) (d)) #else static zend_always_inline long zend_dval_to_lval(double d) { if (d > LONG_MAX) { #ifdef ZEND_DVAL_TO_LVAL_USE_FMOD unsigned long ul = (unsigned long) fmod(d, (double) LONG_MIN * -2 /*ULONG_MAX + 1*/); #else unsigned long ul = (unsigned long) d; #endif if (ul > LONG_MAX) { /* return *(long *) &ul; */ return (long) (ul + LONG_MIN) + LONG_MIN; } return (long) ul; } else if (d < LONG_MIN) { #ifdef ZEND_DVAL_TO_LVAL_USE_FMOD unsigned long ul = (unsigned long) fmod(-d, (double) LONG_MIN * -2 /*ULONG_MAX + 1*/); #else unsigned long ul = (unsigned long) -d; #endif if (ul > LONG_MAX) { /* return -*(long *) &ul; */ return -(long) (ul + LONG_MIN) + LONG_MIN; } return -(long) ul; } return (long) d; } #endif