/*   -*- coding: utf-8 -*-  */
/**********************************************************************
*
*  module   : StrDict
*  fichier  : StrDictMerge.c  (ex StrSearchMerge)
*  Auteur   : Jacques DUCLOY
*  Date     : Juillet 97
*
***********************************************************************/

#include "StrSearch.h"
#include "Buffer.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

void usage()
{
  fprintf(stderr,"usage: StrDictMerge -cse -m \n");
  exit(EXIT_FAILURE);
}

int getopt();
extern char *optarg;

static  Buffer *ligne;
static Buffer *bufComMake;
static   StrSearchTable *dict;
static int listOption;

char *StrSearchBufferGets(b1)
     Buffer *b1;
{
  char *ret;
  ret = BufferGets(b1);
  if (listOption)printf("%s\n",BufferString(b1));
  return ret;
}

char *StrSearchGetRule(toPurge)
     int toPurge;
{
  char *pos;
  char *posSC;
  char *key;
  int len;
  char *posEndKey;
  
  if(toPurge)pos=BufferString(ligne);
  else
    {
      if(!( pos=StrSearchBufferGets(ligne)))return NULL;
    }
  if(*pos=='#')return StrSearchGetRule(0);
  while(*pos==' ')pos++;
  if(!(*pos))return StrSearchGetRule(0);
  if(!(posSC=strchr(pos,':')))
    {
      fprintf(stderr, "**** StrSearchMerge line %s not fit", 
	     BufferString(ligne));
      exit(1);
    }
  posEndKey=posSC;
  while ((posEndKey>pos)&&(*(posEndKey-1)==' '))posEndKey--;
  len = posEndKey-pos;
  key = malloc(len+1);
  strncpy(key, pos, len); 
  key[len]='\0';
  BufferStrcpy(bufComMake, posSC);
  while (((BufferString(bufComMake))[BufferLen(bufComMake)-1])=='\\')
    {
      BufferCharCat(bufComMake,'\n');
      StrSearchBufferGets(ligne);
      BufferStrcat(bufComMake, BufferString(ligne));
    }
  BufferCharCat(bufComMake,'\n');
  while ((StrSearchBufferGets(ligne))&&(BufferString(ligne)[0])=='\t')
    {      
      BufferStrcat(bufComMake, BufferString(ligne));
      BufferCharCat(bufComMake,'\n');
    }
  StrSearchPut(dict,key, BufferSave(bufComMake));
  return BufferString(bufComMake);
}

void StrSearchMake()
{
   if (StrSearchGetRule(0))
     {
       while (StrSearchGetRule(1)){;};
     }
}

int main(int argc, char **argv)
{
  int c;
  char *pos;
  char *posTab;
  char *posEndKey;
  char *posEndVal;
  int len;
  char *key;
  char *value;
  int shellMode;
  int exportFlag;
  int cshFlag;
  char *makeRule;

  makeRule=NULL;
  shellMode=0;
  exportFlag=0;
  cshFlag=0;
  listOption=0;

  while((c=getopt(argc,argv,"ceslm:"))!=EOF)
    {
      switch(c)
	{
	case 'c':
	  cshFlag=1;
	  break;

	case 'e':
	  exportFlag=1;
	  break;

	case 'l':
	  listOption=1;
	  break;

	case 's':
	  shellMode=1;
	  break;

	case 'm':
	  makeRule=optarg;
	  break;

	default:
	  usage();
	}
    }
  dict = StrSearchTableCreate(1000,1000);
  ligne= BufferCreate(100,50);
  bufComMake= BufferCreate(100,50);
  if(makeRule) StrSearchMake();
  else
    {
      while ((pos=StrSearchBufferGets(ligne)))
	{
	  if(shellMode)
	    {
	      while((c=*pos)&&(c==' '))pos++;
	      if((posTab=strchr(pos,'=')))
		{
		  posEndKey=posTab;
		  while ((posEndKey>pos)&&(*(posEndKey-1)==' '))posEndKey--;
		  len = posEndKey-pos;
		  key = malloc(len+1);
		  strncpy(key, pos, len); 
		  key[len]='\0';
		  
		  posTab++;
		  while((c=*posTab)&&(c==' '))posTab++;
		  posEndVal=posTab+strlen(posTab)-1;
		  while((posEndVal>posTab)&&(*(posEndVal)==' '))*(posEndVal--)='\0';
		  if ((len = strlen(posTab)))
		    {
		      if (strpbrk(posTab," ;&<>"))
			{
			  value=malloc(len+3);
			  strcpy(value,"\"");
			  strcat(value,posTab);
			  strcat(value,"\"");
			}
		      else
			{
			  value=malloc(len+1);
			  strcpy(value,posTab);		      
			}
		      
		      StrSearchPut(dict,key,value);
		    }
		  else StrSearchPut(dict,key,NULL);
		}
	      else StrSearchPut(dict,strdup (pos), NULL);
	    }
	  else
	    {
	      if((posTab=strchr(pos,'\t')))
		{
		  len = posTab-pos;
		  key=malloc(len+1);
		  strncpy(key, pos, len); 
		  key[len]='\0';
		  
		  posTab++;
		  
		  if((len = strlen(posTab)))
		    {
		      value=malloc(len+1);
		      strcpy(value,posTab);
		      StrSearchPut(dict,key,value);
		    }
		  else StrSearchPut(dict,key,NULL);
		}
	      else  StrSearchPut(dict,strdup (pos), NULL);
	      
	    } /* end if shell mode then */
	} /* end while */
    }

  if (makeRule)
    {
      char *r1;
      if ((r1=StrSearch(dict, makeRule)))
	printf("%s%s\n", makeRule, r1);
    }
  
  StrSearchIteratorReset(dict);
 
  while ((key=StrSearchNext(dict)))
    {
      if((value=StrSearchValue(dict)))
	{
	  if(shellMode)
	    {
	      if (cshFlag) printf("setenv %s %s \n", key, value);
	      else printf("%s=%s\n", key, value);
	    }
	  else if (makeRule)
	    {
	      if (strcmp(makeRule,key)!=0)printf("%s%s\n", key, value);
	    }
	  else printf("%s\t%s\n", key, value);
	}
      else
	{
	  if(shellMode)
	    {
	      if (cshFlag) printf("setenv %s \n", key);
	      printf("%s=\"\"\n", key);
	    }
	  else printf("%s\n", key);
	}
      if (exportFlag) printf("export %s\n", key);
    }

  exit(0);
  return 0;
}

