/* only for getting the pe struct */
#include <windows.h>
#include <winnt.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "misc.h"
#include "any_op.h"
#include "From/ARM/ARM.h"
#include "From/m68k/m68k.h"
#include "From/PPC/PPC.h"


/* retun 
 * 0 = Ok 
 * 1 = unimplemt 
 * 2 = Unkonwn Opcode 
 * 3 = can not open read file
 * 4 = can not open write file
 * 5 = can not seek to end of read file
 * 6 = can not get the file size of the read file
 * 7 = read file size is Zero
 * 8 = can not alloc memory
 * 9 = can not read file
 *-------------------------
 * type 0 : auto
 * type 1 : bin
 * type 2 : exe/dll/sys
 */



/* Conveting bit array to a int byte */
CPU_UNINT ConvertBitToByte(CPU_BYTE *bit)
{
    CPU_UNINT Byte = 0;
    CPU_INT t;
    CPU_UNINT size = 15;

    for(t=size;t>=0;t--)
    {
        if (bit[size-t] != 2) 
            Byte = Byte + (bit[size-t]<<t);
    }
    return Byte;
}

/* Conveting bit array mask to a int byte mask */
CPU_UNINT GetMaskByte(CPU_BYTE *bit)
{
    CPU_UNINT MaskByte = 0;
    CPU_INT t;
    CPU_UNINT size = 15;

    for(t=size;t>=0;t--)
    {
        if (bit[size-t] == 2) 
        {            
            MaskByte = MaskByte + ( (bit[size-t]-1) <<t);
        }
    }
    return MaskByte;
}

/* Conveting bit array to a int byte */
CPU_UNINT ConvertBitToByte32(CPU_BYTE *bit)
{
    CPU_UNINT Byte = 0;
    CPU_INT t;
    CPU_UNINT size = 31;

    for(t=size;t>=0;t--)
    {
        if (bit[size-t] != 2) 
            Byte = Byte + (bit[size-t]<<t);
    }
    return Byte;
}

/* Conveting bit array mask to a int byte mask */
CPU_UNINT GetMaskByte32(CPU_BYTE *bit)
{
    CPU_UNINT MaskByte = 0;
    CPU_INT t;
    CPU_UNINT size = 31;

    for(t=size;t>=0;t--)
    {
        if (bit[size-t] == 2) 
        {            
            MaskByte = MaskByte + ( (bit[size-t]-1) <<t);
        }
    }
    return MaskByte;
}



CPU_UNINT GetData32Le(CPU_BYTE *cpu_buffer)
{
    CPU_UNINT cpuint;
    CPU_UNINT split1;
    CPU_UNINT split2;
    CPU_UNINT split3;
    CPU_UNINT split4;

    cpuint = *((CPU_UNINT*) &cpu_buffer[0]);

    split1 = cpu_buffer[0];
    split2 = cpu_buffer[1];
    split3 = cpu_buffer[2];
    split4 = cpu_buffer[3];


    cpuint = split4+(split3 <<8 )+(split2 <<16 )+(split1 <<24 );

    return cpuint;
}

CPU_UNINT GetData32Be(CPU_BYTE *cpu_buffer)
{
    CPU_UNINT cpuint;

    cpuint = *((CPU_UNINT*) &cpu_buffer[0]);

    return cpuint;
}


CPU_INT AllocAny()
{

    if (pMyBrainAnalys== NULL)
    {
        pMyBrainAnalys = (PMYBrainAnalys) malloc(sizeof(MYBrainAnalys));
        if (pMyBrainAnalys==NULL)
        {
            return -1;
        }
        ZeroMemory(pMyBrainAnalys,sizeof(MYBrainAnalys));
        pStartMyBrainAnalys = pMyBrainAnalys;
    }
    else
    {
        PMYBrainAnalys tmp;
        tmp = (PMYBrainAnalys) malloc(sizeof(MYBrainAnalys));
        if (tmp==NULL)
        {
            return -1;
        }
        ZeroMemory(tmp,sizeof(MYBrainAnalys));

        pMyBrainAnalys->ptr_next = (CPU_BYTE*)tmp;
        tmp->ptr_prev= (CPU_BYTE*)pMyBrainAnalys;
        
        pMyBrainAnalys = tmp;
    }
return 0;
}

CPU_INT FreeAny()
{
  PMYBrainAnalys tmp = NULL;

  if (pMyBrainAnalys == NULL)
  {
      return -1;
  }

  tmp = (PMYBrainAnalys)pMyBrainAnalys->ptr_prev;

  while (pMyBrainAnalys != NULL)
  {
    if (pMyBrainAnalys == NULL)
    {
        break;
    }

    free(pMyBrainAnalys);

    if (pMyBrainAnalys != NULL)
    {
        printf("fail to free memory");
        return -1;
    }

    pMyBrainAnalys = tmp;
  }

  return 0;
}