/*   -*- coding: utf-8 -*-  */
/**********************************************************************
*
*  module   : Hfd
*  fichier  : HfdIndexSelect.c
*  Auteur   : Jacques DUCLOY
*  Date     : Décembre 94
*   ex IndexSelect

Introduction option r pour récupérer la clé interne du record
*
***********************************************************************/
 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "StrDict.h"
#include "SxPath.h"
#include "HfdIndex.h"

HfdIndex *hfd1;

int               flagRecordKey;
int               flagSplit;
SxPathResult     *pathSplit;

void usage()
{
  fprintf (stderr,"usage: HfdIndexSelect [-S] [-s path] -h hfd [-k key]...\n");
  exit(EXIT_FAILURE);
}

void resul(char *str)
{
  SxmlNode *n;
  char *posTab;

  if ((posTab=strchr(str,'\t')))
    {
      posTab[0]='\0';
      posTab++;
    }
  if(flagRecordKey)
    {
      if((n=HfdIndexReadSxmlRecord(hfd1, str)))
	{
	  SxmlPrint(n);
	}
    }
  else
    {
      if((n=HfdIndexReadSxmlRecord(hfd1, str)))
	{   
	  if(flagSplit)
	    {
	      if (flagSplit==1)
		{
		  SxmlNode *listElem;
		  SxmlNode *liElem;
		  listElem=SxmlLastChild(SxmlLastChild(n));
		  SxmlReset(listElem);
		  while ((liElem=SxmlNextNode(listElem)))
		    {
		      if (posTab)printf("%s\t%s\n",SxmlLeafText(liElem),posTab);
		      else printf("%s\n",SxmlLeafText(liElem));
		    }
		}
	    }
	  else
	    {
	      SxmlPrint(SxmlLastChild(n));
	      if (posTab)printf("\t%s\n", posTab);
	      else putchar('\n');
	    }
	}
    }
}

void HfdIndexSelect_Error(char *mess1, char *mess2)
{
  fprintf(stderr, "IndexSelect: *** ERROR ***\n");
  fprintf(stderr, "%s%s\n", mess1, mess2);
  usage();
}


extern char *optarg;   
extern int   optind;
int getopt();

int main(int argc, char **argv)
{
 int cod_arg;
 int flagInput;
 Buffer *buf;
 char *input;
 
 flagRecordKey=0;
 flagSplit=0;
 pathSplit=NULL;
 flagInput=0;
 HfdIndexBoolInit();
  while (((cod_arg = getopt(argc,argv,"iIh:k:rs:S"))!=EOF))
    {
      switch(cod_arg)
	{
	case 'r':
	  flagRecordKey=1;
	  break;
	case 's':
	  flagSplit=2;
	  if (!(pathSplit=SxPathSetCompile(optarg)))
	    HfdIndexSelect_Error(optarg," : path incorrect");
	  break;
	case 'S':
	  flagSplit=1;
	  break;
	case 'k':
	  resul(optarg);
	  break;
	case 'i':
	case 'I':
	  flagInput=1;
	  break;
	case 'h':
	  hfd1=HfdIndexOpenRead(optarg);
	  if (!hfd1) 
	    {
	      printf ("**** HfdIndexSelect: hfd %s does not exist or not fit ****\n", optarg);
	      exit (EXIT_FAILURE);
	    }
	  break;
	default:
	  usage();
	}
    };

  if (flagInput==1)
    {
      buf=BufferCreate(132,132);
      while ((input = BufferGets(buf)))
	{
	  resul(input);
	};
    };
  exit (EXIT_SUCCESS);
}
