/*-
 * Copyright (c) 1999 Takanori Watanabe
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *	$Id: aml_print.c,v 1.4 1999/04/27 01:52:51 takawata Exp $
 */
#include <stdio.h>
#include "aml_elem.h"
#include "aml_parse.h"

aml_print(struct aml_object *obj)
{
  int i,j;
  struct instruction *inst;
  struct aml_env copy;
  inst=obj->objs[0].inst;
  if(obj==NULL){
    printf("//WARNING NULL OBJECT\n");
    return ;
  }
  printf("%s(",inst->name);
  for(i=0;inst->args[i]!='\0';i++){
    switch(inst->args[i]){
    case 'B':
    case 'W':
    case 'D':
      printf("%x ",obj->objs[i+1].num);
      break;
    case 'O':
      printf(" ");
      aml_print(obj->objs[i+1].obj);
      break;
    case 'N':
      for(j=0;j<4;j++){
	putchar(obj->objs[i+1].name[j]);
      }
      break;
    case 'M':
      for(j=0;j<obj->objs[i+1].num;j++){
	aml_print(obj->objs[j+2].obj);
	printf("\\");
      }
      break;
    default:
      break;
    }
  }
  /*Dont insert code here*/
  printf(")\n");
  /*Don't inseart code here*/
  if(inst->varobj!=NULL){
    printf("{\n");
    copy=*obj->objs[i+1].aenv;
    switch(inst->varobj[0]){
    case 'O':
      while(copy.code<copy.length){
	obj=ReadObject(&copy);
	aml_print(obj);
	DestroyAMLObj(obj);
      }
      break;
    case 'F':      
      while(copy.code<copy.length){
	obj=ReadField(&copy);
	printf("[");
	aml_print(obj);
	printf("]");
	DestroyAMLObj(obj);
      }
      break;
    case 'B':
      for(;copy.code<copy.length;copy.code++){
	printf(" %02x ",*copy.code);
      }
      	break;
    }
    printf("}\n");
  }
}

