/* NOTE: all invalid cases are handled by yacc rules */ HB_EXPR_PTR hb_compExprNewNegate( HB_EXPR_PTR pNegExpr ) { HB_EXPR_PTR pExpr; if( pNegExpr->ExprType == HB_ET_NUMERIC ) { if( pNegExpr->value.asNum.NumType == HB_ET_DOUBLE ) { pNegExpr->value.asNum.dVal = - pNegExpr->value.asNum.dVal; pNegExpr->value.asNum.bWidth = (unsigned char) HB_DBL_LENGTH( pNegExpr->value.asNum.dVal ); } else { pNegExpr->value.asNum.lVal = - pNegExpr->value.asNum.lVal; pNegExpr->value.asNum.bWidth = (unsigned char) HB_LONG_LENGTH( pNegExpr->value.asNum.lVal ); } pExpr = pNegExpr; } else { pExpr = hb_compExprNew( HB_EO_NEGATE ); pExpr->value.asOperator.pLeft = pNegExpr; pExpr->value.asOperator.pRight = NULL; } return pExpr; }
/* NOTE: all invalid cases are handled by yacc rules */ PHB_EXPR hb_compExprNewNegate( PHB_EXPR pNegExpr, HB_COMP_DECL ) { PHB_EXPR pExpr; if( pNegExpr->ExprType == HB_ET_NUMERIC ) { if( pNegExpr->value.asNum.NumType == HB_ET_DOUBLE ) { pNegExpr->value.asNum.val.d = -pNegExpr->value.asNum.val.d; pNegExpr->value.asNum.bWidth = ( HB_UCHAR ) HB_DBL_LENGTH( pNegExpr->value.asNum.val.d ); } else { #if -HB_VMLONG_MAX > HB_VMLONG_MIN if( pNegExpr->value.asNum.val.l < -HB_VMLONG_MAX ) { pNegExpr->value.asNum.NumType = HB_ET_DOUBLE; pNegExpr->value.asNum.val.d = -( double ) pNegExpr->value.asNum.val.l; pNegExpr->value.asNum.bWidth = ( HB_UCHAR ) HB_DBL_LENGTH( pNegExpr->value.asNum.val.d ); pNegExpr->value.asNum.bDec = 0; } else #endif { pNegExpr->value.asNum.val.l = -pNegExpr->value.asNum.val.l; pNegExpr->value.asNum.bWidth = HB_DEFAULT_WIDTH; } } pExpr = pNegExpr; } else { pExpr = HB_COMP_EXPR_NEW( HB_EO_NEGATE ); pExpr->value.asOperator.pLeft = pNegExpr; pExpr->value.asOperator.pRight = NULL; } return pExpr; }