#include"mbasic.h"

#define MAX_VARIABLE		1024

extern int DOS_APP;

static char * var_names[MAX_VARIABLE];

void InitVariables(void)
{
 int i;
 for(i=0;i<MAX_VARIABLE;i++)
 {
  var_names[i]=0;
 }
 RegisterVariable("dummy_variable");
}

static int var_lookup(char * n)
{
 int i;
 for(i=0;i<MAX_VARIABLE;i++)
 {
  if(var_names[i] && !strncmp(var_names[i],n,strlen(n)) &&
     strlen(n)==strlen(var_names[i])) return 1;
 }
 return 0;
}

void RegisterVariable(char * n)
{
 int i;
 if(var_lookup(n)) return;
 for(i=0;i<MAX_VARIABLE;i++)
 {
  if(!var_names[i])
  {
   var_names[i]=malloc(strlen(n)+1);
   if(!var_names[i]) Error("Internal error: Unable to allocate var_names[%u]",i);
   memcpy(var_names[i],n,strlen(n)+1);
   return;
  }
 }
 Error("Internal error: Grow MAX_VARIABLE in file %s",__FILE__);
}

void EmitVariables(void)
{
 int i;
 _emit("VAR_POOL_BEGIN:\n");
 for(i=0;i<MAX_VARIABLE;i++)
 {
  if(var_names[i])
  {
   if(DOS_APP)
   {
    _emit("%s dd 0\n",var_names[i]);
   } else {   
    if(EQU_VARS)
    { 
     _emit("%s equ VAR_POOL_BEGIN+%u\n",var_names[i],i<<2);
    } else { 
     if(!IS_FASM_SYNTAX) 
     {
      _emit("%s: resd 1\n",var_names[i]);
     } else {
      _emit("%s: rd 1\n",var_names[i]);
     }
    }
    free(var_names[i]);
   }
  }
 }
 _emit("VAR_POOL_END:\n");
}
