/*   -*- coding: utf-8 -*-  */
/**********************************************************************
*
*  module   : Hfd
*  fichier  : Hcs.c
*  Auteur   : Jacques DUCLOY
*  Date     : Novembre 2013
*
* set of tools dealing with Hfs Control Structure (hcs)
*
************************************************************************
* 
*     Copyleft () 2013 Jacques Ducloy
*
***********************************************************************/
#include "Hcs.h"
#include "Buffer.h"

SxmlNode *HcsImplicitHcs()
{
  SxmlNode *hcs;
  hcs=SxmlFromString("<hfd><struct><dir><digit>0123456789ABCDRF</digit><digit>0123456789ABCDEF</digit></dir><file><digit>0123456789ABCDEF</digit><digit>0123456789ABCDEF</digit></file><key><digit>0123456789</digit><digit>0123456789</digit></key></struct></hfd>");
  return hcs;
}

char *HcsGetFirstKeyBuffer (SxmlNode *hcs, Buffer *bufferKey)
{
  SxmlNode *structHcs;
  SxmlNode *dirOrFile;
  SxmlNode *digitNode;
  char *digitStr;

  BufferReset(bufferKey);
  if (!(structHcs=SxmlGetFirstChildByTagName(hcs, "struct"))) return NULL;
  SxmlReset (structHcs);
  while ((dirOrFile=SxmlNextNode(structHcs)))
    {
      SxmlReset(dirOrFile);
      while ((digitNode=SxmlNextNode(dirOrFile)))
	{
	  digitStr=SxmlLeafText(digitNode);
	  BufferCharCat(bufferKey, digitStr[strlen(digitStr-1)]);
	}
    }
  return BufferString (bufferKey);
}

char *HcsGetNextKeyBuffer (SxmlNode *hcs, Buffer *bufKey)
{
  SxmlNode *structHcs;
  SxmlNode *dirOrFile;
  SxmlNode *digitNode;
  char     *digitStr;
  char     *key;
  int indicKey;

  if (!(structHcs=SxmlGetFirstChildByTagName(hcs, "struct"))) return NULL;
  key=BufferString(bufKey);
  dirOrFile=SxmlLastChild(structHcs);
  indicKey=strlen(key);
  while (dirOrFile)
    {
      digitNode=SxmlLastChild(dirOrFile);
      while(digitNode)
	{
	  char *posInDigit;
	  char  newDigit;
	  digitStr=SxmlLeafText(digitNode);
	  indicKey--;                                  /* from n-1 to 0 */
	  posInDigit=strchr(digitStr, key[indicKey]);
	  if ((newDigit=posInDigit[1]))
	    {
	      key[indicKey]=newDigit;
	      return key;
	    }
	  key[indicKey]=digitStr[0];
	  digitNode=SxmlPreviousSibling(digitNode);
	}
      dirOrFile=SxmlPreviousSibling(dirOrFile);
    }
  return NULL;
}

static Buffer *internalbufKey;

char *HcsGetFirstKey (SxmlNode *hcs)
{
  if (! internalbufKey) internalbufKey=NewBuffer();
  return HcsGetFirstKeyBuffer (hcs, internalbufKey);
}

char *HcsGetNextKey (SxmlNode *hcs, char *pKey)
{
  if (! internalbufKey) internalbufKey=NewBuffer();
  BufferStrcpy( internalbufKey, pKey);
  return HcsGetFirstKeyBuffer (hcs, internalbufKey);
}
