04.11.2013, 02:23
(
Последний раз редактировалось WLSF; 04.11.2013 в 04:57.
)
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
Exemplo de uso:
Registro de um jogador novo.
Exemplo de escrita:
Exemplo de Leitura:
Reportem bugs encontrados, obrigado.
A include e o tуpico estгo sujeitos a mudanзa.
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;
}
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.
- Ao utilizar tags de nome semelhante, elas tem de estar em ordenaзгo alfa-nъmerica.
Reportem bugs encontrados, obrigado.
A include e o tуpico estгo sujeitos a mudanзa.