#include"mbasic.h"

typedef struct
{
 char * name;
 int size;
} array_t;

#define MAX_ARRAYS 	128

static array_t arrays[MAX_ARRAYS];

void gen_array_code(int is_read)
{
 char tmp[64];
 if(is_read)
 {
  STORE_TMP(tmp);
  Match('[');
  Expression();
  Match(']');
  emit("mov eax,[%s+eax*4]\n",tmp);
 } else {
  STORE_TMP(tmp);
  Match('[');
  Expression();
  Match(']');
  Match('=');
  emit("push eax\n");
  Expression();
  emit("pop ebx\n");
  emit("mov [%s+ebx*4],eax\n",tmp);
 }
}

void InitArrays(void)
{
 int i;
 for(i=0;i<MAX_ARRAYS;i++)
 {
  arrays[i].name=NULL;
  arrays[i].size=0;
 }
}

void EmitArrays(void)
{
 int i;
 for(i=0;i<MAX_ARRAYS;i++)
 {
  if(arrays[i].name)
  {
   if(!arrays[i].size) Error("Array list is corrupted");
   if(IS_FASM_SYNTAX)
   {
    _emit("%s: rd %u\n",arrays[i].name,arrays[i].size);
   } else {
    _emit("%s: resd %u\n",arrays[i].name,arrays[i].size);
   }
   free(arrays[i].name);
   arrays[i].name=NULL;
   arrays[i].size=0;
  }
 }
}

void ParseArrayDecl(void)
{
 char tmp[128];
 int sz,i;
 SkipWhite();
 GetName();
 SkipWhite();
 STORE_TMP(tmp);
 Match('(');
 GetNum();
 sz=atoi(current_token);
 SkipWhite();
 Match(')');
 SkipWhite();
 if(!sz) Error("Size of array cannot be 0");
 for(i=0;i<MAX_ARRAYS;i++)
 {
  if(!arrays[i].name && !arrays[i].size)
  {
   arrays[i].name=malloc(strlen(tmp)+1);
   memcpy(arrays[i].name,tmp,strlen(tmp)+1);
   arrays[i].size=sz;
   return;
  }
 }
 Error("No more free entries in table arrays[], grow MAX_ARRAYS, file %s",__FILE__);
}
