/* $Id: SgmlToEdTools.c,v 1.2 2003/04/03 15:18:38 parmentf Exp $ */
#include "SgmlNode.h"
#include "Buffer.h"

void SgmlToEdBeginTag(n1)
SgmlNode *n1;
{
  SgmlNode *l1;
  SgmlNode *a1;
  printf("<%s", SgmlTag(n1));
  if((l1=SgmlAttList(n1)))
    {
      a1=SgmlFirst(l1);
      do
	{
	  printf(" %s=\"%s\"", SgmlAttId(a1), SgmlAttVal(a1));
	}while((a1=SgmlNext(a1)));
    }
  putchar('>');
}

void SgmlToEdNode(n1,b1,n2)
SgmlNode *n1;
Buffer *b1;
int n2;
{
  int i1;
  if(n1)
    {
      printf("%s", BufferString(b1));
      if (SgmlIsData(n1))
	{
	  if ((strcmp(SgmlDataString(n1),"\n")!=0))
	    printf("%s\n",SgmlDataString(n1));
	}
      else
	{
	  SgmlToEdBeginTag(n1);
	  putchar('\n');
	  
	  if((i1=n2))while(i1--)BufferStrcat(b1," ");
	  
	  SgmlToEdList(n1,b1,n2);
	  
	  if(n2)BufferTailCut(b1,n2);
	  
	  printf("%s</%s>\n", BufferString(b1), SgmlTag(n1));
	}      
    }
}

void SgmlIndentList();

void SgmlIndentNode(n1,b1,n2)
SgmlNode *n1;
Buffer *b1;
int n2;
{
  int i1;
  if(n1)
    {
      printf("%s", BufferString(b1));
      if (SgmlIsData(n1))
	{
	  if ((strcmp(SgmlDataString(n1),"\n")!=0))
	    printf("%s\n",SgmlDataString(n1));
	}
      else
	{
	  SgmlToEdBeginTag(n1);
	  putchar('\n');
	  
	  if((i1=n2))while(i1--)BufferStrcat(b1," ");
	  
	  SgmlIndentList(n1,b1,n2);
	  
	  if(n2)BufferTailCut(b1,n2);
	  
	  printf("%s</%s>\n", BufferString(b1), SgmlTag(n1));
	}      
    }
}





void SgmlToEdRoot(n1,b1,n2)
SgmlNode *n1;
Buffer *b1;
int n2;
{
  int n3;

  if (!n1)return;

  SgmlToEdBeginTag(n1);
  putchar('\n');
  BufferStrcpy(b1," ");
  if (n2>1)
    {
      n3=n2-1;
      while(n3--)BufferStrcat(b1," ");
    }
  SgmlToEdList(n1,b1,n2);
  printf("</%s>\n", SgmlTag(n1));
}

void SgmlIndentRoot(n1,b1,n2)
SgmlNode *n1;
Buffer *b1;
int n2;
{
  int n3;

  if (!n1)return;

  SgmlToEdBeginTag(n1);
  putchar('\n');
  BufferStrcpy(b1," ");
  if (n2>1)
    {
      n3=n2-1;
      while(n3--)BufferStrcat(b1," ");
    }
  SgmlIndentList(n1,b1,n2);
  printf("</%s>\n", SgmlTag(n1));
}


void SgmlToEdDump(n1)
SgmlNode *n1;
{
  static Buffer *bufIndent=NULL;
  if(!bufIndent) bufIndent=BufferCreate(20,20);
  SgmlToEdRoot(n1,bufIndent,2);
}

void SgmlToEdList(n1,b1,n2)
SgmlNode *n1;
Buffer *b1;
int n2;
{
  SgmlNode *c1;
  if((n1&&(c1=SgmlFirst(n1))))
    {
      do
	{
	  if (SgmlIsLeaf(c1))
	    {
	      printf("%s", BufferString(b1));
	      SgmlToEdBeginTag(c1);
	      printf("%s\n", SgmlLeafGetData(c1));
	    }
	  else SgmlToEdNode(c1,b1,n2);
	}while((c1=c1->next));
    }
}


void SgmlIndentList(n1,b1,n2)
     SgmlNode *n1;
     Buffer *b1;
     int n2;
{
  SgmlNode *c1;
  if((n1&&(c1=SgmlFirst(n1))))
    {
      do
	{
	  if (SgmlIsLeaf(c1))
	    {
	      printf("%s", BufferString(b1));
	      SgmlPrint(c1);
	      printf("\n");
	    }
	  else SgmlIndentNode(c1,b1,n2);
	}while((c1=c1->next));
    }
}
