[Include] bCini8 - Trabalhando eficazmente/velozmente com arquivos locais
#1

Include bCini8
Eu havia prometido para mim mesmo que eu nгo postaria mais nenhuma include bCini aqui no fуrum, porйm isto fez eu rever o meu conceito sobre esta decisгo... Diversas pessoas nгo sгo capazes de te acompanhar e te julgam por seus trabalhos, e isto nгo й legal.

Entгo, eu estou aqui hoje entгo para postar a include de salvamento de arquivos locais mais rбpida que eu consegui programar atй hoje (que finalmente supera DOF2 em inъmeros aspectos), a oitava e provavelmente (quase que certamente) ъltima versгo desta include, a bCini8, acompanhem:

Funзхes nativas


pawn Code:
bCini6_Open - fopen
bCini6_Exists - fexist
bCini6_Write - fwrite
bCini6_Read - fread
bCini6_Close - fclose
bCini6_Delete - fremove
Escrita


Funзгo ( arquivo, nome da linha, escrita );

Escrevendo textos em um arquivo:

pawn Code:
main()
{
      bCini8_SetText("Biel_COP.ini","Olб","Como vocк vai ?");
}
Escrevendo int's em um arquivo:

pawn Code:
main()
{
      bCini8_SetInt("Biel_COP.ini","Olб",1000);
}
Escrevendo float's em um arquivo:

pawn Code:
main()
{
      bCini8_SetFloat("Biel_COP.ini","Olб",50.0);
}
Leitura


Funзгo ( arquivo, nome da linha );

Lendo textos de um arquivo

pawn Code:
main()
{
      printf("%s",bCini8_ReadText("Biel_COP.ini","Olб"));
}
Lendo int's de um arquivo:

pawn Code:
main()
{
      printf("%d",bCini8_ReadInt("Biel_COP.ini","Olб"));
}
Lendo float's de um arquivo:

pawn Code:
main()
{
      printf("%f",bCini8_ReadFloat("Biel_COP.ini","Olб"));
}
Mais funзхes


bCini8_ReadLineName ( nome do arquivo, id da linha ); - Obtenha o nome do ID de uma linha jб existente.

pawn Code:
main()
{
     printf("%s",bCini8_ReadLineName("Biel_COP.ini",0));
}
bCini8_DeleteSet ( nome do arquivo, nome da linha ); - Delete uma linha que jб existe.

pawn Code:
main()
{
     bCini8_DeleteSet("Biel_COP.ini","Olб");
}
bCini8_Copy ( nome do arquivo 1, nome do arquivo 2, valor da variбvel de deleзгo ); - Copie todo o conteъdo de um arquivo para outro arquivo.

Dica: O valor da variбvel de deleзгo deverб ser 1 para que o arquivo 1 seja deletado apуs ser copiado para o arquivo 2; o valor 0 indica que haverб cуpia, mas nгo haverб deleзгo!

pawn Code:
main()
{
     bCini8_Copy("Biel_COP.ini","Biel.ini",1); // Deletar o arquivo 1 apуs copiб-lo para o arquivo 2
}
bCini8_ChangeLine (nome do arquivo, linha, novo nome da linha); - Troque o nome de uma linha

pawn Code:
main()
{
     bCini8_ChangeLine("Biel_COP.ini","Olб","Olб 2");
}
bCini8_IsSet ( nome do arquivo, nome da linha ); - Cheque se uma linha jб existe.

pawn Code:
main()
{
     if(bCini8_IsSet("Biel_COP.ini","Olб"))
     {
          print("A linha 'Olб' do arquivo 'Biel_COP.ini' existe!");
     }
     return 1;
}
Benchmark com a DOF2


Eu tenho sг consciкncia que o que as diferem em velocidade й algo bem 'rasteiro', porйm jб se dб para notar uma enorme melhora com isto; finalmente houve uma include brasileira que sim, pфde competir com a tгo aclamada DOF2...



Download


Como instalar/usar: Crie um arquivo em sua pasta pawno/includes com o nome de bCini8.inc (sim, a extensгo deve ser .inc para que haja reconhecimento da parte do compilador) e copie/cole todo o cуdigo abaixo neste novo arquivo; apуs isto, vб atй o seu gamemode e use

pawn Code:
#define bCini8.inc
no inнcio do gamemode! Com isto, basta usб-la com as funзхes citadas aqui

pawn Code:
// Include bCini8

#define bCini8_Open fopen
#define bCini8_Exists fexist
#define bCini8_Write fwrite
#define bCini8_Read fread
#define bCini8_Close fclose

#define bCini8_Create(%0) if(!bCini8_Exists(%0)) bCini8_Close(bCini8_Open(%0,io_write)) && bCini8_OpenArchive(%0)
#define bCini8_Delete(%0) if(bCini8_Exists(%0)) fremove(%0)

// Include definitions

#define bCini8_Lines 100
#define bCini8_Capacity 256

#define bCini8_Separator "="
#define bCini8_Null_Text "null"

// Variables

stock bCini8_Archive_Line[bCini8_Lines][bCini8_Capacity/4],bCini8_Archive_Value[bCini8_Lines][bCini8_Capacity],bCini8_Archive_Name[64] = bCini8_Null_Text,bCini8_Archive_Lines = 1,bool:bCini8_Archive_Has_Been_Used,Include_bCini8[bCini8_Capacity];

// Functions

#define bCini8_SetInt(%0,%1,%2) format(Include_bCini8,bCini8_Capacity,"%d",%2) && bCini8_SetText(%0,%1,Include_bCini8)
#define bCini8_SetFloat(%0,%1,%2) format(Include_bCini8,bCini8_Capacity,"%.2f",%2) && bCini8_SetText(%0,%1,Include_bCini8)

#define bCini8_ReadText(%0,%1) bCini8_Archive_Value[bCini8_IsSet(%0,%1)]
#define bCini8_ReadInt(%0,%1) strval(bCini8_Archive_Value[bCini8_IsSet(%0,%1)])
#define bCini8_ReadFloat(%0,%1) floatstr(bCini8_Archive_Value[bCini8_IsSet(%0,%1)])

#define bCini8_CleanArchive(%0) if(bCini8_Exists(%0)) bCini8_OpenArchive(%0); for(new i = 1; i < bCini8_Archive_Lines; ++i) bCini8_DeleteSet(%0,bCini8_Archive_Line[i])
#define bCini8_Log(%0,%1) new File:bCini8_Archive = bCini8_Open(%0,io_append); bCini8_Write(bCini8_Archive,%1) && bCini8_Close(bCini8_Archive)

stock bCini8_SetText(archive[],line[],value[])
{
    if(bCini8_Archive_Lines < bCini8_Lines)
    {
        bCini8_Create(archive);

        if(!bCini8_IsSet(archive,line))
        {
            // Line

            strunpack(bCini8_Archive_Line[bCini8_Archive_Lines],line);

            if(!strlen(bCini8_Archive_Line[bCini8_Archive_Lines]))
            {
                strunpack(bCini8_Archive_Line[bCini8_Archive_Lines],bCini8_Null_Text);
            }
            // Value

            strunpack(bCini8_Archive_Value[bCini8_Archive_Lines],value);

            if(!strlen(bCini8_Archive_Value[bCini8_Archive_Lines]))
            {
                strunpack(bCini8_Archive_Value[bCini8_Archive_Lines],bCini8_Null_Text);
            }
            ++bCini8_Archive_Lines;
        }
        else
        {
            new bCini8_Line_ID = bCini8_IsSet(archive,line);

            strunpack(bCini8_Archive_Value[bCini8_Line_ID],value);

            if(!strlen(bCini8_Archive_Value[bCini8_Line_ID]))
            {
                strunpack(bCini8_Archive_Value[bCini8_Line_ID],bCini8_Null_Text);
            }
        }
        bCini8_Archive_Has_Been_Used = true;
    }
    return 1;
}
stock bCini8_ReadLineName(archive[],line)
{
    bCini8_OpenArchive(archive);

    return bCini8_Archive_Line[line];
}
stock bCini8_DeleteSet(archive[],line[])
{
    new bCini8_Line_ID = bCini8_IsSet(archive,line);

    if(bCini8_Line_ID)
    {
        bCini8_Archive_Line[bCini8_Line_ID][0] = 0;
        bCini8_Archive_Value[bCini8_Line_ID][0] = 0;

        bCini8_Archive_Has_Been_Used = true;
    }
    return 1;
}
stock bCini8_Copy(archive[],archive2[],bool:delete_archive)
{
    if(bCini8_Exists(archive))
    {
        if(!bCini8_Exists(archive2))
        {
            bCini8_OpenArchive(archive);

            new File:bCini8_Archive_Used = bCini8_Open(archive2,io_write),bCini8_Format[bCini8_Capacity];

            for(new i = 1; i < bCini8_Archive_Lines; ++i)
            {
                if(bCini8_Archive_Line[i][0])
                {
                    format(bCini8_Format,bCini8_Capacity,"%s=%s\r\n",bCini8_Archive_Line[i],bCini8_Archive_Value[i]);

                    bCini8_Write(bCini8_Archive_Used,bCini8_Format);
                }
            }
            bCini8_Close(bCini8_Archive_Used);

            if(delete_archive)
            {
                bCini8_Delete(archive);
            }
        }
    }
    return 1;
}
stock bCini8_ChangeLine(archive[],line[],new_line[])
{
    if(bCini8_Exists(archive))
    {
        new bCini8_Line_ID = bCini8_IsSet(archive,line);

        if(bCini8_Line_ID)
        {
            strunpack(bCini8_Archive_Line[bCini8_Line_ID],new_line);

            bCini8_Archive_Has_Been_Used = true;
        }
    }
    return 1;
}
// Open & Close

stock bCini8_OpenArchive(archive[])
{
    if(strcmp(bCini8_Archive_Name,archive,false))
    {
        bCini8_CloseArchive();

        strunpack(bCini8_Archive_Name,archive);

        if(bCini8_Exists(archive))
        {
            new bCini8_i[2],bCini8_Archive[bCini8_Capacity],File:bCini8_Archive_Used = bCini8_Open(archive,io_read);

            while(bCini8_Read(bCini8_Archive_Used,bCini8_Archive))
            {
                if(bCini8_Archive[0])
                {
                    if(bCini8_Archive_Lines < bCini8_Lines)
                    {
                        if(bCini8_Archive[0] >= 256)
                        {
                            strdel(bCini8_Archive,0,1);
                        }
                        bCini8_i[0] = strlen(bCini8_Archive);

                        if(bCini8_Archive[bCini8_i[0]-1] == '\r' || bCini8_Archive[bCini8_i[0]-1] == '\n')
                        {
                            bCini8_Archive[bCini8_i[0]-1] = 0;
                        }
                        if(bCini8_Archive[bCini8_i[0]-2] == '\r' || bCini8_Archive[bCini8_i[0]-2] == '\n')
                        {
                            bCini8_Archive[bCini8_i[0]-2] = 0;
                        }
                        bCini8_i[1] = strfind(bCini8_Archive,bCini8_Separator);

                        strmid(bCini8_Archive_Line[bCini8_Archive_Lines],bCini8_Archive,0,bCini8_i[1],bCini8_i[1]+1);
                        strmid(bCini8_Archive_Value[bCini8_Archive_Lines],bCini8_Archive,bCini8_i[1]+1,bCini8_i[0]);

                        ++bCini8_Archive_Lines;
                    }
                }
            }
            bCini8_Close(bCini8_Archive_Used);
        }
    }
    return 1;
}
stock bCini8_CloseArchive()
{
    if(bCini8_Exists(bCini8_Archive_Name))
    {
        if(bCini8_Archive_Has_Been_Used)
        {
            new File:bCini8_Archive_Used = bCini8_Open(bCini8_Archive_Name,io_write),bCini8_Format[bCini8_Capacity];

            for(new i = 1; i < bCini8_Archive_Lines; ++i)
            {
                if(bCini8_Archive_Line[i][0])
                {
                    format(bCini8_Format,bCini8_Capacity,"%s=%s\r\n",bCini8_Archive_Line[i],bCini8_Archive_Value[i]);

                    bCini8_Write(bCini8_Archive_Used,bCini8_Format);
                }
            }
            bCini8_Close(bCini8_Archive_Used);
        }
    }
    for(new i = 1; i < bCini8_Archive_Lines; ++i)
    {
        if(bCini8_Archive_Line[i][0])
        {
            bCini8_Archive_Line[i][0] = 0;
            bCini8_Archive_Value[i][0] = 0;
        }
    }
    bCini8_Archive_Name = bCini8_Null_Text;
    bCini8_Archive_Lines = 1;
    bCini8_Archive_Has_Been_Used = false;

    return 1;
}
stock bCini8_IsSet(archive[],line[])
{
    bCini8_OpenArchive(archive);

    for(new i = 1; i < bCini8_Archive_Lines; ++i)
    {
        if(bCini8_Archive_Line[i][0])
        {
            if(strcmp(bCini8_Archive_Line[i],line,true) == 0)
            {
                return i;
            }
        }
    }
    return 0;
}
// End of the include


Crйditos


Biel (me): Toda as versхes da bCini.
W. Luigi: Ajuda inicial (bCini e bCini2).
Bruno: Ajuda inicial (bCini).
Gato: Ajuda na funзгo de criar arquivos (bCini).
DracoBlue: Lуgicas iniciais (bCini, bCini2 e bCini3).
Reply


Messages In This Thread

Forum Jump:


Users browsing this thread: 1 Guest(s)