[Include] w!ini - Versгo de estudos
#1

Introduзгo

Bom, decidi postar essa include porque desenvolvi ela de uma forma um pouco diferente das demais, apesar de ter feito ela rapidinho aqui, pretendo implementar ela e deixar mais rбpida / eficiente, as modificaзхes dela podem incluir atй uma versгo em plugin.
OBS: Й possнvel que este conceito seja re-implementado para i_ini(parte da lib IPSI).

O que essa include oferece que as demais nгo oferecem ?
teoricamente falando, nada, ela oferece a garantia de funcionalidade se o usuбrio seguir seu padrгo, e oferece tambйm velocidade em alguns casos.




Include
w!ini.inc

pawn Код:
/*
*
* --- w!ini ---
* Por Willian Luigi
*
*
*   - Functions:
*
*       i_create    (filename[])    - Cria um arquivo.
*       i_open      (filename[], t) - Abre um arquivo para leitura(t = 0), ou escrita(t = 1).
*       i_read      (tag[], str[])  - Lк o valor de uma tag e inseri na str.
*       i_readBool  (tag[])         - Lк o valor de uma tag e retorna o bool.
*       i_readFloat (tag[])         - Lк o valor de uma tag e retorna o float.
*       i_readInt   (tag[])         - Lк o valor de uma tag e retorna o int.
*       i_write     (tag[], val[])  - Escreve uma tag e um valor string.
*       i_writeFloat(tag[], val[])  - Escreve uma tag e um valor float.
*       i_writeInt  (tag[], val[])  - Escreve uma tag e um valor int.
*       i_writeBool (tag[], val[])  - Escreve uma tag e um valor bool.
*       i_save      ()              - Salva e fecha o arquivo aberto.
*
*/

#if defined _wini_included
#endinput
#endif
#define _wini_included
#pragma library wini

#define i_exist(%0)     fexist(%0)
#define INI             stock
#define read            (0)
#define write           (1)

#define i_writeFloat(%0,%1) \
        i_write(%0,#%1)
#define i_writeInt(%0,%1) \
        i_write(%0,#%1)
#define i_writeBool(%0,%1) \
        i_write(%0,%1?("true"):("false"))
#define i_readFloat(%0) \
        floatstr(_utils_r(%0))
#define i_readInt(%0) \
        strval(_utils_r(%0))
#define i_readBool(%0) \
        bool:(!strcmp(_utils_r(%0), "true"))

INI __PWOKFDAOCNODDIQIOEOHVPWURV[5000];
INI File:_@file_name;

INI i_create (file[])
{
    if (!i_exist(file))
    {
        fclose(fopen(file, io_write));
    }
}
INI i_open (file[], writting = 0)
{
    if (i_exist(file))
    {
        if (_@file_name)
            fclose(_@file_name);

        _@file_name = fopen(file, io_read);

        if (_@file_name)
        {
            new _@tmp[128];
            __PWOKFDAOCNODDIQIOEOHVPWURV[0] = '\0';

            while (fread(_@file_name, _@tmp))
            {
                strcat(__PWOKFDAOCNODDIQIOEOHVPWURV, _@tmp);
            }
            fclose(_@file_name);

            if (writting)
                _@file_name = fopen(file, io_write);
        }
    }
}
INI i_save ()
{
    if (_@file_name)
    {
        fwrite(_@file_name, __PWOKFDAOCNODDIQIOEOHVPWURV);

        fclose(_@file_name);
    }
}
INI i_write (tag[], val[])
{
    if (_@file_name)
    {
        if (!__PWOKFDAOCNODDIQIOEOHVPWURV[0])
        {
            format(__PWOKFDAOCNODDIQIOEOHVPWURV, sizeof(__PWOKFDAOCNODDIQIOEOHVPWURV), "%s=%s\r\n", tag, val);
        }
        else
        {
            new _@i = strfind(__PWOKFDAOCNODDIQIOEOHVPWURV, tag);

            if (_@i != -1)
            {
                strdel(__PWOKFDAOCNODDIQIOEOHVPWURV[_@i], 1 + strlen(tag), strfind(__PWOKFDAOCNODDIQIOEOHVPWURV[_@i], "\r\n"));
                strins(__PWOKFDAOCNODDIQIOEOHVPWURV, val, _@i + 1 + strlen(tag));
            }
            else
            {
                format(__PWOKFDAOCNODDIQIOEOHVPWURV, sizeof(__PWOKFDAOCNODDIQIOEOHVPWURV), "%s%s=%s\r\n", __PWOKFDAOCNODDIQIOEOHVPWURV, tag, val);
            }
        }
    }
}
INI i_read (tag[], str[])
{
    if (_@file_name)
    {
        new _@i = strfind(__PWOKFDAOCNODDIQIOEOHVPWURV, tag);

        if (_@i != -1)
        {
            new _@len = strfind(__PWOKFDAOCNODDIQIOEOHVPWURV[_@i], "\r\n");
            //strmid((str[0] = '\0', str), __PWOKFDAOCNODDIQIOEOHVPWURV[_@i], 1 + strlen(tag), strfind(__PWOKFDAOCNODDIQIOEOHVPWURV[_@i], "\r\n"), strfind(__PWOKFDAOCNODDIQIOEOHVPWURV[_@i], "\r\n") - 1 + strlen(tag));
            strmid((str[0] = '\0', str), __PWOKFDAOCNODDIQIOEOHVPWURV[_@i], 1 + strlen(tag), _@len, _@len - 1 + strlen(tag));
        }
    }
}
INI _utils_r(tag[])
{
    new _@task[20];
    i_read(tag, _@task);
   
    return _@task;
}






Exemplo de uso:
pawn Код:
public OnPlayerConnect(playerid)
{
    if (!getPlayerFile(playerid))
    {
        i_create(PlayerFile(playerid)); //registrado
        i_open(PlayerFile(playerid), write); //abrindo arquivo

        i_write("senha", "senha_padrao"); //escrevendo senha
        i_save(); //salvando arquivo + fechando arquivo
    }
}

stock getPlayerFile(playerid)
{
    new nome[30];
    GetPlayerName(playerid, nome, sizeof(nome));
    strcat(nome, ".ini");
    return i_exist(nome);
}
stock PlayerFile(playerid)
{
    new nome[30];
    GetPlayerName(playerid, nome, sizeof(nome));
    strcat(nome, ".ini");
    return nome;
}
Registro de um jogador novo.





Exemplo de escrita:
pawn Код:
main()
{
    i_create("arquivo.ini");
   
    i_open("arquivo.ini", write);
   
    i_write("String", "teste de escrita string");
    i_writeInt("int", 20);
    i_writeFloat("float", 2.6);
    i_writeBool("bool", false);
   
    i_save();
}




Exemplo de Leitura:
pawn Код:
main()
{
    i_open("arquivo.ini"); //quando й leitura, nгo precisa por o segundo param.
   
    new str[128]; i_read("String", str);
    new integer = i_readInt("int");
    new Float:floatt = i_readFloat("float");
    new bool:boolean = i_readBool("bool");

    printf("%s, %d, %f, %i", str, integer, floatt, boolean);
}





  • Requisitos para um arquivamento correto:

    • Ao utilizar tags de nome semelhante, elas tem de estar em ordenaзгo alfa-nъmerica.
      Exemplo: vocк tem 2 tags semelhantes "teste", "teste2", como a teste2 vem depois da teste em questхes de ordenaзгo, na hora de arquivar isto a criaзгo de tags tem de ser a mesma, teste tem de ser arquivado primeiro do que teste2.
    • Ter a certeza de que o arquivo existe, ao usar i_open.
    • Sempre especificar para o i_open qual o tipo de operaзгo desejada (write = escrita), (read = leitura)
      pawn Код:
      i_open("file.ini", read); //abrindo arquivo para leitura,
      //logo vocк nгo precisa utilizar i_save.

      i_open("file.ini", write); //abrindo arquivo para escrita,
      //й necessбrio utilizar i_save, caso contrбrio
      //seu progresso nгo serб salvo.
    • Lembrar sempre de utilizar i_save apуs terminar a escrita do seu arquivo.


Reportem bugs encontrados, obrigado.


A include e o tуpico estгo sujeitos a mudanзa.
Reply
#2

Eu tava discutindo com alguns colegas, BlueX, Bruno, entre mais alguns...

A respeito de formas para fazer um gerenciador de arquivos melhor, um tempo atrбs eu postei um
plug-in que abordava salvamento de uma forma diferente das padrхes(utilizadas no sa-mp), e agora estou lanзando essa include, e gostaria da opiniхes das pessoas que entendam do assunto e dos usuбrios tambйm.

O BlueX citou que muitas pessoas deixariam de usar o PLUG-IN pelo fato de ter um trabalho a mais na instalaзгo, etc...

O Bruno citou que um plug-in poderia melhorar o processamento em geral.

Eu usei como citaзгo o Sistema de salvamento que eu postei, pois com plug-in eu poderia utilizar estruturas moldadas para manipular arquivos, de forma simples/fбcil e rбpida.

Deixem suas opiniхes sobre isso abaixo, se possнvel.
Reply
#3

@OFF
Nem citou meu nome, Badi boi.

@Topic:
Parabens a um tempo vocк e os outros vem com essa ideia da ini em plugin.
Reply
#4

Nгo quero bancar uma de menino mau, apenas tenho uma crнtica construtiva:

As possibilidades de alguйm utilizar este seu sistemas sгo quase nulas, pois jб tem muitos na board que fazem exatamente oque o seu faz, porйm mais rбpido.

Claro que, se adicionar funзхes extras sua include serб a mais utilizada de todas, porйm nгo nenhum diferencial, apenas tem um source code complicado que nгo estou vendo nada para "estudo", apesar de eu ter capacidade suficiente de criar uma include dessas, tive dificuldade de entender algumas partes pelo simples fato de ter coisas sem nexo, nomes sem nexos(variбveis/definiзхes) assim transparecendo o nнvel de programador vocк й, que para mim limita mais sua inteligкncia.

Pois este seu cуdigo nгo irб ensinar ninguйm, irб complicar mais ainda quem precisa ou quer aprender.

Eu por exemplo, estou desenvolvendo uma plugin para manipulaзгo de arquivos, faz 1 semana com funзхes novas que sгo impossнveis utilizando as funзхes nativas do PAWN, pois eu acho que este й o diferencial do meu projeto que eu estou fazendo, pois nгo hб outro igual na board(atй publiquei no Skype da iPs TeaM), e por isto comecei a desenvolve-lo.

Esta й minha sincera opiniгo, nгo quero generalizar nada, iniciar uma flame-war em seu tуpico, porйm notei isto.
Reply
#5

Quote:
Originally Posted by zSuYaNw
Посмотреть сообщение
Nгo quero bancar uma de menino mau, apenas tenho uma crнtica construtiva:

As possibilidades de alguйm utilizar este seu sistemas sгo quase nulas, pois jб tem muitos na board que fazem exatamente oque o seu faz, porйm mais rбpido.

Claro que, se adicionar funзхes extras sua include serб a mais utilizada de todas, porйm nгo nenhum diferencial, apenas tem um source code complicado que nгo estou vendo nada para "estudo", apesar de eu ter capacidade suficiente de criar uma include dessas, tive dificuldade de entender algumas partes pelo simples fato de ter coisas sem nexo, nomes sem nexos(variбveis/definiзхes) assim transparecendo o nнvel de programador vocк й, que para mim limita mais sua inteligкncia.

Pois este seu cуdigo nгo irб ensinar ninguйm, irб complicar mais ainda quem precisa ou quer aprender.

Eu por exemplo, estou desenvolvendo uma plugin para manipulaзгo de arquivos, faz 1 semana com funзхes novas que sгo impossнveis utilizando as funзхes nativas do PAWN, pois eu acho que este й o diferencial do meu projeto que eu estou fazendo, pois nгo hб outro igual na board(atй publiquei no Skype da iPs TeaM), e por isto comecei a desenvolve-lo.

Esta й minha sincera opiniгo, nгo quero generalizar nada, iniciar uma flame-war em seu tуpico, porйm notei isto.
Obrigado pela opiniгo, eu entendo totalmente seu ponto de vista, a include realmente nгo tem o intuito de disputar com as demais, por enquanto se for o caso futuramente... Vocк citou o inicial do seu plug-in eu sу estou querendo puxar ideias para o mesmo, й sempre bom.

Agora veja bem, na nossa board a ъnica include que conheзo й a bini, e que ainda sim eu nгo obtive bons resultados com ela, as demais, caso vocк esteja falando da 'bCini' perde em seguranзa(pois o cуdigo era falho em certos casos) e em outros demasiados aspectos, sу conheзo estas duas que foram apresentadas.

Com relaзгo aos estudos, a include й/estб mais simples possнvel, uma vez que um programador como vocк entende a lуgica, o nome da variбvel pode ser o mais bizarro possнvel, eu nгo usei de lуgicas complexas, pelo contrбrio...
Atй simplifiquei a aplicaзгo do write/read/open, a questгo do nome da variбvel, й que ela retйm as informaзхes importantes da transaзгo dos arquivos, entгo eu nгo queria deixar um nomezinho qualquer, assim para garantir que ninguйm vai chegar perto de causar conflitos, ou acessar ela sem querer, por acaso...

Se o plug-in que vocк citou й o projeto com o Bruno, entгo o meu post reservado tem a intenзгo de recolher opiniхes e informaзхes que possam ajudar na construзгo dele, jб que todos estamos nessa suruba da IPSI.

Obrigado pelo post, apesar de eu nгo ter notado a parte 'construtiva'.
Reply
#6

Quote:
Originally Posted by Willian_Luigi
Посмотреть сообщение
Obrigado pela opiniгo, eu entendo totalmente seu ponto de vista, a include realmente nгo tem o intuito de disputar com as demais, por enquanto se for o caso futuramente... Vocк citou o inicial do seu plug-in eu sу estou querendo puxar ideias para o mesmo, й sempre bom.

Agora veja bem, na nossa board a ъnica include que conheзo й a bini, e que ainda sim eu nгo obtive bons resultados com ela, as demais, caso vocк esteja falando da 'bCini' perde em seguranзa(pois o cуdigo era falho em certos casos) e em outros demasiados aspectos, sу conheзo estas duas que foram apresentadas.

Com relaзгo aos estudos, a include й/estб mais simples possнvel, uma vez que um programador como vocк entende a lуgica, o nome da variбvel pode ser o mais bizarro possнvel, eu nгo usei de lуgicas complexas, pelo contrбrio...
Atй simplifiquei a aplicaзгo do write/read/open, a questгo do nome da variбvel, й que ela retйm as informaзхes importantes da transaзгo dos arquivos, entгo eu nгo queria deixar um nomezinho qualquer, assim para garantir que ninguйm vai chegar perto de causar conflitos, ou acessar ela sem querer, por acaso...

Se o plug-in que vocк citou й o projeto com o Bruno, entгo o meu post reservado tem a intenзгo de recolher opiniхes e informaзхes que possam ajudar na construзгo dele, jб que todos estamos nessa suruba da IPSI.

Obrigado pelo post, apesar de eu nгo ter notado a parte 'construtiva'.
Quote:
Originally Posted by zSuYaNw
Посмотреть сообщение
[...]

Claro que, se adicionar funзхes extras sua include serб a mais utilizada de todas, porйm nгo nenhum diferencial, apenas tem um source code complicado que nгo estou vendo nada para "estudo"
[...]
A parte construtiva foi a oque eu menos abordei, mas enfim.

E sim, a plugin estamos "fabricando" й para IPSI, o projeto inicial seria dela seria muito em peso funзхes nunca vistas, que inovaria o cenбrio da programaзгo, assim abrangendo o limite de funзхes.


Creio que vocк nгo estб criando algo para ser estudada, pois vejamos algumas partes:


pawn Код:
#define INI             stock // kill brain
#define read            (0)
#define write           (1)


Criar definiзхes nгo significa em deixar o cуdigo limpo para o aprendizado, apenas confunde mais e mais a mente do jovem programador.



pawn Код:
strmid((str[0] = '\0', str), __PWOKFDAOCNODDIQIOEOHVPWURV[_@i], 1 + strlen(tag), _@len, _@len - 1 + strlen(tag));
Que pode ser entendia facilmente desta forma:

pawn Код:
new
    tamanho_tag
;

tamanho_tag = strlen(tag);

// Limpar string
str[0] = '\0';

// strmid(dest[], source[], start, end);  - extrai parte de uma string
strmid(str, __PWOKFDAOCNODDIQIOEOHVPWURV[_@i], 1 + tamanho_tag, _@len, _@len - 1 + tamanho_tag);


Hб uns tempos atrбs eu criei um cуdigo sobre este fim, que ensinava passo a passo, sem nomes estranhos ou frescuras.

http://pastebin.com/LQQEL3SS


Enfim bom projeto, finalizo por aqui.
Reply
#7

Quote:
Originally Posted by zSuYaNw
Посмотреть сообщение
A parte construtiva foi a oque eu menos abordei, mas enfim.
Aquilo nгo me pareceu construtivo, apenas lуgica simples, й уbvio que se eu diferenciar a include e deixa-la mais aplicada, mais pessoas irгo utilizar..

Quote:
Originally Posted by zSuYaNw
Посмотреть сообщение
Creio que vocк nгo estб criando algo para ser estudada, pois vejamos algumas partes:


pawn Код:
#define INI             stock // kill brain
#define read            (0)
#define write           (1)


Criar definiзхes nгo significa em deixar o cуdigo limpo para o aprendizado, apenas confunde mais e mais a mente do jovem programador.



pawn Код:
strmid((str[0] = '\0', str), __PWOKFDAOCNODDIQIOEOHVPWURV[_@i], 1 + strlen(tag), _@len, _@len - 1 + strlen(tag));
Que pode ser entendia facilmente desta forma:

pawn Код:
new
    tamanho_tag
;

tamanho_tag = strlen(tag);

// Limpar string
str[0] = '\0';

// strmid(dest[], source[], start, end);  - extrai parte de uma string
strmid(str, __PWOKFDAOCNODDIQIOEOHVPWURV[_@i], 1 + tamanho_tag, _@len, _@len - 1 + tamanho_tag);


Hб uns tempos atrбs eu criei um cуdigo sobre este fim, que ensinava passo a passo, sem nomes estranhos ou frescuras.

http://pastebin.com/LQQEL3SS


Enfim bom projeto, finalizo por aqui.
O seu post indica que vocк entendeu o cуdigo com facilidade, logo ele й aplicado para estudos, й como eu te falei...

Se matou a charada da lуgica, a nomenclatura ou a aplicaзгo dela nгo chega a ter um peso grande, vai ter peso pra quem nгo entende nada...
E pra mexer com arquivos em si, vocк jб precisa entender sim um pouco que nгo seja ctrl+c/ctrl+v.

Bem notado, eu realmente nгo fiz ela 'para' estudos, eu fiz 'por' estudo, queria deixar ela aqui para receber dicas tanto a respeito da questгo do plug-in, como a respeito das funcionalidades, por isso nгo citei 'beta', 'original', 'teste', botei apenas 'versгo de estudo', mas jб mudo isto se foi o problema.
Desculpe o mal entendido.

Quote:
Originally Posted by zSuYaNw
Посмотреть сообщение
Enfim bom projeto.
Obrigado, gato.
Reply
#8

nao vejo problema nenhum do uso de plugin...

o uso e meio parecido com y_ini e SII...


parabens will pelo bom trabalho.
Reply
#9

Parabens cara! Sempre falei que vc й o mestre da programaзгo kkkk
Reply
#10

Interessante Will, concordo com Suyan em certos pontos, mas parabйns.
Quanto ao plugin, acho desnecessбrio, pelo fato de que as pessoas iniciantes nгo estгo nem ai pra velocidade, quem realmente se importa com tal assunto sгo os mais experientes, que jб tem capacidade de criar sua prуpria include/plugin de salvamento.

Abraзos.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)