/***********************************************************************
*
*               Module   : StrDict
*               Fichier  : StrDictKey.c
*               Auteur   : J. DUCLOY
*               Date     : Oct 97
* $Id: StrSearchKey.c,v 1.2 2005/07/12 07:55:42 parmentf Exp $
*
************************************************************************/

#include "StrDict.h"
#include "Buffer.h"
#include <stdio.h>
#include <string.h>

void usage()
{
  fprintf(stderr,"usage: StrDictKey -rxs -f fileDict [-f fileDict]... [-k key]... \n");
  exit(1);
}

int getopt();
extern char *optarg;
static StrDict *tableTrans;

int main(int argc, char **argv)
{
  int c;
  char mode;
  Buffer *record;
  Buffer *bufKey;
  char *key;
  char *posTab;
  int  selectFlag;
  char *trans;

  selectFlag=0;
  tableTrans=NULL;
  record=BufferCreate(100,100);
  bufKey=BufferCreate(100,100);
  mode='\0';

  while((c=getopt(argc,argv,"k:rsf:x"))!=EOF)
    {
      switch(c)
	{
	case 'k':
	  {
	    char *resu;
	    if ((resu=StrDictSearch(tableTrans,optarg)))
	      printf("%s\n", resu);
	    else
	      {
		if (mode=='r')printf ("%s\n", optarg);
	      }
	    mode='k';
	    break;
	  }

        case 's':
	  selectFlag=1;
	  break;

	case 'f':
	  if (!tableTrans)tableTrans=StrDictCreate(100, 0);
	  StrDictAddFromFile(tableTrans, optarg);
	  break;

	case 'x':
	  mode='x';
	  break;

	case 'r':
	  mode='r';
	  break;

	default:
	  usage();
	}
    }
  if (selectFlag&&(!mode))mode='s';
  switch(mode)
    {
    case 'k':
      break;
    case 'x':
    case 's':
    case 'r':
      while((BufferGets(record)))
	{
	  if((posTab=strchr(BufferString(record),'\t')))
	    {
	      BufferStrncpy(bufKey,
			    BufferString(record),
			    posTab-BufferString(record));
	      key=BufferString(bufKey);
	    }
	  else
	    {
	      key=BufferString(record);
	    }
	  if ((trans=StrDictSearch(tableTrans,key)))
	    {
	      switch(mode)
		{
		case 's':
		  printf("%s\n", BufferString(record));
		  break;
		case 'x':
		  break;
		case 'r':
		  printf("%s", trans);
		  if(posTab)printf("%s\n", posTab);
		  else printf("\n");
		  break;
		}
	    }
	  else 
	    {
	      switch(mode)
		{
		case 'x':
		  printf("%s\n", BufferString(record));
		  break;
		case 's':
		  break;
		case 'r':
		  if(selectFlag)break;
		  printf("%s\n", BufferString(record));
		  break;
		}
	    }
	  
	}
      break;
    }
  return(0);
}

