#include "analizador.h"

//Creacion de un nuevo Analizador. 
PAnalizador nuevoAnalizador(PBYTE buffer, SIZE_T tamano) {
    //v2 change to syscalls
    PAnalizador pAnalizador = (PAnalizador)LocalAlloc(LPTR, sizeof(Analizador));
    pAnalizador->buffer = NULL;
    pAnalizador->tamano = tamano;
    pAnalizador->tamanoOriginal = tamano;
    pAnalizador->original = (PBYTE)LocalAlloc(LPTR, tamano);

    if (!pAnalizador->original) {
        return NULL;
    }

    memcpy(pAnalizador->original, buffer, tamano);
    pAnalizador->buffer = pAnalizador->original;

    return pAnalizador;
}

VOID liberarAnalizador(PAnalizador analizador) {

    analizador->original = NULL;
    analizador->buffer = NULL;
    LocalFree(analizador);

}

BYTE getByte(PAnalizador analizador) {

    BYTE intByte = 0;
    if (analizador->tamano < 1) {
        return 0;
    }

    //v2. Syscalls
    memcpy(&intByte, analizador->buffer, 1);
    analizador->buffer += 1;
    analizador->tamano -= 1;

    return intByte;

}


UINT32 getInt32(PAnalizador analizador) {

    UINT32 intByte = 0;
    if (analizador->tamano < 4) {
        return 0;
    }

    //v2. Syscalls
    memcpy(&intByte, analizador->buffer, 4);
    analizador->buffer += 4;
    analizador->tamano -= 4;

    return BYTESWAP32(intByte);

}

UINT64 getInt64(PAnalizador analizador) {

    UINT64 intByte = 0;
    if (analizador->tamano < 8) {
        return 0;
    }

    //v2. Syscalls
    memcpy(&intByte, analizador->buffer, 8);
    analizador->buffer += 8;
    analizador->tamano -= 8;

    return BYTESWAP64(intByte);

}

PBYTE getBytes(PAnalizador analizador, PSIZE_T tamano) {

    SIZE_T length = 0;
    if (*tamano == 0) {

        length = getInt32(analizador);
        *tamano = length;
    }
    else {

        length = *tamano;

    }

    PBYTE datosDeSalida = (PBYTE)LocalAlloc(LPTR, length);
    if (!datosDeSalida) {
        return NULL;
    }

    memcpy(datosDeSalida, analizador->buffer, length);
    analizador->buffer += length;
    analizador->tamano -= length;

    return datosDeSalida;
}

PCHAR getString(PAnalizador analizador, PSIZE_T tamano) {

    return (PCHAR)getBytes(analizador, tamano);
}

PWCHAR getWString(PAnalizador analizador, PSIZE_T tamano) {

    return (PWCHAR)getBytes(analizador, tamano);

}
