/*->c.trans */


#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <stdio.h>


#include "h.os"
#include "h.wimp"
#include "h.bbc"

#include "h.wos"
#include "h.flex"
#include "h.fsx"



#include "h.trans"


static char * text;
static int    size;

/* merge in a new translation table */

os_error * addtranstable(char * name)
{
 os_error * err;
 fstat      f;
 int        fh;
 char     * p;

 err=stat(name,&f);
 if(!err)
 {
  if(!f.object)
  {
   errorbox("Messages not found");
  }
  else
  {
   flex_extende((flex_ptr)&text,size+f.length+2);
   if(!err)
   {
    err=fs_open(name,'r',&fh);
    if(!err)
    {
     p=text+size;
     err=fs_read(fh,p,f.length);
     if(!err)
     {
      *(p+f.length)=0;
      *(p+f.length+1)=0;
      size+=f.length;

      while(1)
      {
       while(*p && *p!=':') p++;
       if(!*p) break;
       *p++=0;
       while(*p && *p>=31) p++;
       *p++=0;
       if(!*p) break;
      }
     }
     err=fs_close(fh,err);
    }
   }
  }
 }

 return(err);
}



char * transtoken(char * token)
{
 char * p;
 char * q;
 int    len;

 if(text)
 {
  p=text;

  while(1)
  {
   q=p;
   len=strlen(p);
   if(!len)
   {
    p=token;
    break;
   }
   p+=len+1;
   if(!strcmp(token,q)) break;
   len=strlen(p);
   if(!len)
   {
    p=token;
    break;
   }
   p+=len+1;
  }
 } else p=token;

 return(p);
}




/* translate the text in the buffer */

os_error * trans(char * buffer,int maxlen)
{
 char * p;
 char * q;
 char   token[32];
 int    size;
 int    len;
 int    delta;


 p=buffer;
 size=strlen(buffer);

 while(*p)
 {
  if(*p++=='{')
  {
   if(!*p) break;
   else
   if(*p=='{')
   {
    memmove(p-1,p,size-(p-buffer)+1);
    size--;
    p++;
   }
   else  /* a token */
   {
    q=token;
    while(*p && *p!='}') *q++=*p++;
    if(!*p) break;
    *q=0;
    p++;
    q=transtoken(token);
    len=strlen(q);

    delta=len-(2+strlen(token));
    if((size+delta)<maxlen)
    {
     memmove(p+delta,p,size-(p-buffer)+1);
     p+=delta-len;
     size+=delta;
     memcpy(p,q,len);
    }
   }
  }
 }
 return(NULL);
}

os_error * inittrans(void)
{
 os_error * err;

 flex_alloce((flex_ptr)&text,0);
 size=0;
 err=addtranstable("<ArcFaxRes$Dir>.Messages");

 return(err);
}



