예제 #1
0
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);
  }

}
예제 #2
0
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);
}
예제 #3
0
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);
}
예제 #4
0
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);

  }


}