node* CALCCONSTmonop(node *arg_node, info *arg_info){ DBUG_ENTER ("CALCCONSTmonop"); node * ret; MONOP_EXPR( arg_node) = TRAVopt( MONOP_EXPR( arg_node), NULL); nodetype nt = NODE_TYPE(MONOP_EXPR( arg_node)); if(MONOP_OP(arg_node) == MO_not && nt == N_bool){ ret = TBmakeBool(! BOOL_VALUE(MONOP_EXPR( arg_node))); FREEdoFreeNode(arg_node); DBUG_RETURN(ret); }else if(MONOP_OP(arg_node) == MO_neg){ if(nt == N_int){ ret = TBmakeInt(-INT_VALUE(MONOP_EXPR( arg_node))); FREEdoFreeNode(arg_node); DBUG_RETURN(ret); }else if(nt == N_float){ ret = TBmakeFloat(-FLOAT_VALUE(MONOP_EXPR( arg_node))); FREEdoFreeNode(arg_node); DBUG_RETURN(ret); }else{ DBUG_RETURN (arg_node); } }else{ DBUG_RETURN (arg_node); } }
node *MDUNPACKdefs( node *arg_node, info *arg_info ) { node *temp; DBUG_ENTER("MDUNPACKmodule"); if(DEFS_DEF(arg_node) != NULL) { DEFS_DEF(arg_node) = TRAVdo(DEFS_DEF(arg_node), arg_info); } if(DEFS_NEXT(arg_node) != NULL) { DEFS_NEXT(arg_node) = TRAVdo(DEFS_NEXT(arg_node), arg_info); } if(DEFS_DEF(arg_node) == NULL) { temp = DEFS_NEXT(arg_node); FREEdoFreeNode(arg_node); arg_node = temp; } DBUG_RETURN(arg_node); }
node *MDREMDUPmetadatakeylist( node *arg_node, info *arg_info ) { node *temp; DBUG_ENTER("MDREMDUPmetadatakeylist"); if(!INFO_IS_CHECKING(arg_info)) { /* See if this node has a duplicate */ INFO_IS_CHECKING(arg_info) = TRUE; INFO_CURRENT(arg_info) = arg_node; INFO_IS_DUPLICATE(arg_info) = FALSE; /* Search for duplicate */ if(METADATAKEYLIST_NEXT(arg_node) != NULL) { METADATAKEYLIST_NEXT(arg_node) = TRAVdo(METADATAKEYLIST_NEXT(arg_node), arg_info); } if(INFO_IS_DUPLICATE(arg_info)) { /* Handle rest of the lsit and then remove this node */ INFO_IS_CHECKING(arg_info) = FALSE; if(METADATAKEYLIST_NEXT(arg_node) != NULL) { temp = TRAVdo(METADATAKEYLIST_NEXT(arg_node), arg_info); } METADATAKEYLIST_NEXT(arg_node) = NULL; FREEdoFreeNode(arg_node); arg_node = temp; } else { /* Handle rest of the list */ INFO_IS_CHECKING(arg_info) = FALSE; if(METADATAKEYLIST_NEXT(arg_node) != NULL) { METADATAKEYLIST_NEXT(arg_node) = TRAVdo(METADATAKEYLIST_NEXT(arg_node), arg_info); } } } else { /* Check if this node is a duplicate with the current node */ if(STReq(METADATAKEYLIST_KEY(INFO_CURRENT(arg_info)), METADATAKEYLIST_KEY(arg_node))) { INFO_IS_DUPLICATE(arg_info) = TRUE; } else { if(METADATAKEYLIST_NEXT(arg_node) != NULL) { METADATAKEYLIST_NEXT(arg_node) = TRAVdo(METADATAKEYLIST_NEXT(arg_node), arg_info); } } } DBUG_RETURN(arg_node); }
node* CALCCONSTcast(node *arg_node, info *arg_info){ DBUG_ENTER ("CALCCONSTcast"); CAST_EXPR( arg_node) = TRAVopt( CAST_EXPR( arg_node), NULL); node * ret; switch(NODE_TYPE(CAST_EXPR( arg_node))){ case N_bool: switch(CAST_TYPE(arg_node)){ case VT_bool: //no cast needed ret = CAST_EXPR( arg_node); FREEdoFreeNode(arg_node); DBUG_RETURN(ret ); break; case VT_int: //FREEcast(arg_node); ret = TBmakeInt((int)BOOL_VALUE(CAST_EXPR( arg_node))); FREEdoFreeNode(arg_node); DBUG_RETURN(ret ); break; case VT_float: //FREEcast(arg_node); ret = TBmakeFloat((float)BOOL_VALUE(CAST_EXPR( arg_node))); FREEdoFreeNode(arg_node); DBUG_RETURN(ret ); break; default: DBUG_RETURN(arg_node); } break; case N_int: switch(CAST_TYPE(arg_node)){ case VT_bool: ret =TBmakeBool(INT_VALUE(CAST_EXPR( arg_node))); FREEdoFreeNode(arg_node); DBUG_RETURN(ret ); break; case VT_int: //no cast needed ret = CAST_EXPR( arg_node); FREEdoFreeNode(arg_node); DBUG_RETURN(ret ); break; case VT_float: ret =TBmakeFloat((float)INT_VALUE(CAST_EXPR( arg_node) )); FREEdoFreeNode(arg_node); DBUG_RETURN(ret ); break; default: DBUG_RETURN(arg_node); } break; case N_float: switch(CAST_TYPE(arg_node)){ case VT_bool: ret =TBmakeBool(FLOAT_VALUE(CAST_EXPR( arg_node))); FREEdoFreeNode(arg_node); DBUG_RETURN(ret ); break; case VT_int: ret =TBmakeInt(FLOAT_VALUE(CAST_EXPR( arg_node))); FREEdoFreeNode(arg_node); DBUG_RETURN(ret ); break; case VT_float: //no cast needed ret = CAST_EXPR( arg_node); FREEdoFreeNode(arg_node); DBUG_RETURN(ret ); break; default: DBUG_RETURN(arg_node); } break; default: DBUG_RETURN(arg_node); } }