/*   -*- coding: utf-8 -*-  */

/******************************************************************************
*
*               Module   : Buffer
*               Fichier  : BufferFormat.c
*               Auteur   : J. DUCLOY
*               Date     : Septembre 2020
*
******************************************************************************/
#include "Buffer.h"
#include <string.h>


BufferFormatMemory* NewBufferFormatMemory()
{
   BufferFormatMemory *memory;
   int i;

   memory = (BufferFormatMemory *) malloc(sizeof(BufferFormatMemory));
   memory->bufArray=(Buffer **)malloc(sizeof(Buffer*)*16*4);  
         /* char *[4 * 16] ; for 4 lines of ascii char */
   for (i=0 ; i<=63 ; i++) memory->bufArray[i]=NULL;
   memory->escapeChar='%';
   memory->result=NewBuffer();
   return memory;
}

char *BufferFormatMemorySet(BufferFormatMemory* mem1, char c1, char *str)
{
   int i;
   i=c1-'@';    /* bufArray[0] is for ascii char '@'  */
   if (! mem1->bufArray[i]) mem1->bufArray[i]=NewBuffer();
   BufferStrcpy(mem1->bufArray[i], str);
   return BufferString(mem1->bufArray[i]);
}

char *BufferFormatMemoryGet(BufferFormatMemory* mem1, char c1)
{
   int i;
   i=c1-'@'; 
   if (mem1->bufArray[i]) return BufferString(mem1->bufArray[i]);
   return NULL;
}

char *BufferFormatEval(BufferFormatMemory *mem1,  char *f1)
{
   char *evalPos;
   char *memStr;
   char *escapePos;

   evalPos=f1;
   BufferReset (mem1->result);
   
   while ((escapePos=strchr(evalPos, mem1->escapeChar)))
      {
          BufferStrncat(mem1->result, evalPos, escapePos-evalPos);
          if ((memStr=BufferFormatMemoryGet(mem1, escapePos[1]))) BufferStrcat( mem1->result, memStr);
          else BufferStrcat( mem1->result, "*** null***");
          evalPos=escapePos+2;
      }
   BufferStrcat(mem1->result, evalPos);
   return BufferString (mem1->result);
}

