.:: Menu Rápido ::.

Linux | C/C++ | Downloads | SDL | [×]

terça-feira, 6 de novembro de 2007

Simpatizando com a Libxml2

Usar uma biblioteca é a melhor idéia que você poder ter ! E principalmente se tratando de uma coisa tão prática como XML !
Reinventar a roda é legal, mas não tem justificativa se a sua roda for "redonda" como todas as outras !

» Post Completo...

FILE *file = fopen("contato.xml","wb");
fprintf(file,"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n");
fprintf(file,"<root>\n");
fprintf(file,"\t<contato>\n");
fprintf(file,"\t\t<nome>%s</nome>\n",nome);
fprintf(file,"\t\t<fone>%s</fone>\n",fone);
fprintf(file,"\t\t<email>%s</email>\n",email);
fprintf(file,"\t</contato>\n");
fprintf(file,"</root>");
fclose(file);

Agora vem a parte que todos estão esperando. Como eu faço para recuperar tudo isso ?!
É aqui que entra a libxml2. De forma bem genérica você só precisa fazer isto:

xmlDocPtr doc; //- ponteiro do documanto
xmlNode *root; //- ponteiro raiz

LIBXML_TEST_VERSION
doc = xmlReadFile(file, NULL, 0); //- Uso genérico
root = xmlDocGetRootElement(doc);
função_de_tratamento(root); //- aqui vc já pode trabalhar
xmlFreeDoc(doc);

xmlCleanupParser();
xmlMemoryDump();

Download: » Código Fonte

*** Documentação Libxml2 ***
Mesmo sendo escrita em c, a libxml2 (e muitas outras) tem conceitos de Orientação a Objetos. Sabendo isso a documentação não será mais uma dor de cabeça.
xmlAttr, xmlDoc, xmlElement, xmlNode. Todos tem a mesma estrutura genérica inicial:

struct ESTRUTURA_GENÉRICA{
void * _private;
xmlElementType type; //- Identificação
const xmlChar *name; //- Nome
struct _xmlNode *children;
struct _xmlNode *last;
struct _xmlDtd *parent;
struct _xmlNode *next; //- Próximo elemento
struct _xmlNode *prev;
struct _xmlDoc *doc;
...
}

E podem ser identificadas por "type":

Enum xmlElementType {
XML_ELEMENT_NODE = 1
XML_ATTRIBUTE_NODE = 2
XML_TEXT_NODE = 3
XML_CDATA_SECTION_NODE = 4
XML_ENTITY_REF_NODE = 5
XML_ENTITY_NODE = 6
XML_PI_NODE = 7
XML_COMMENT_NODE = 8
...
}

Como você pôde ver, muitos tipos são compatíveis entre si. E ainda existem outros tipos, que na verdade, são os mesmos !

Typedef xmlNode* xmlNodePtr

Para mais informações leia a documentação oficial, pois isto foi só um resumão !

.:: Update 05/07/2008 ::.
Depois de algum tempo sem usar a libXML no Dev-Cpp (Devido a alguns probleminhas que antes não pareciam ter solução) resolvi examinar mais a fundo e ver o que eu tinha feito de errado.
No Linux é super de boa, pois a lib é da GNU e não tem porque dar problemas. No Windows também é simples, se você souber o que você está fazendo.
Acabei de descobrir que no Windows a libMXL tem mais duas dependências: libiconv e zlib.
» libiconv acusa erro na compilação: iconv.h: No such file or directory.
» zlib acusa erro na DLL: Você não precisa linkar a lib em seu projeto, mas a DLL zlib1.dll não pode ser esquecida.

Para instalar a libXML no Dev-Cpp use o repositório DevPaks ou o assistente de instalação do Dev-Cpp (WebUpdate) localizado em Ferramentas > Atualizações. Baixe os pacotes libxml2, libiconv e zlib.
Desconfio que o pacote libxml2 versão 2.6.23 tem pequenos problemas, pois tive que fazer algumas correções:
» -lxml2 seria o suficiente para que a lib fosse linkada em nosso projeto, mas tive que linkar com -llibxml2. Minha explicação é que onde deveria existir o arquivo libxml2.a existe o arquivo libxml2.lib... se fosse lib*.a eu não precisaria do prefixo lib.
» libiconv-2.dll. Este é o arquivo exigido quando se roda a aplicação e não iconv.dll como vem na instalação (diretório_do_Dev/bin).

O código de exemplo tem disponível duas versões versões compiladas (windows e Linux)... aproveitem !

*** Link's ***
Download: » Código Fonte
» Documentação libxml2
» Exemplos libxml2
» Definição XML (wikipedia)
» Tutorial XML (Super recomendado)

sexta-feira, 2 de novembro de 2007

AsciiGen - Tabela ASCII em C

Vira e mexe, a gente sempre precisa ter uma tabela ASCII em mãos !
E nada mais fácil do que um programa (para Windows e Linux) que além de gerar a tabela ASCII, também possa gerar seu nome em decimal, hexadecimal, etc...

*** Formas de Uso ***
$ ./asciigen - Gera a tabela ASCII.
$ ./asciigen -h - O Help do programa.

Por exemplo: Para gerar meu nome em hexadecimal.

$ ./asciigen -c Diogo_RBG -f:0x%02X, -n:14
0x44,0x69,0x6F,0x67,0x6F,0x5F,0x52,0x42,0x47,

Os mais atentos já entenderam o esquema ! O parâmetro -f tem a mesma formatação da função printf() !

Donwload: » AsciiGen 0.1

---
A outra vantagem é o código fonte, que é muito simples e está todo comentado !!!

segunda-feira, 22 de outubro de 2007

DR Quebra-Cabeça disponível para download !!!

Propaganda é a alma do negócio ! E pensando dessa forma eu criei uma página para um jogo meu, o Quebra-Cabeça.
» DR Quebra-Cabeça 0.1.1


Esta não é a versão mais nova do meu jogo, infelizmente eu perdi parte do meu código e isso foi o que eu consegui recuperar !

Baixe o jogo, se divirta, e depois poste aqui o que você achou !

segunda-feira, 8 de outubro de 2007

Conexão com API C do MySQL

O MySQL é um servidor de banco de dados. Isso significa que ele fica rodando na máquina à espera que uma conexão socket solicite um serviço. Sua API é escrita originalmente em C pela equipe MySQL e depois é transcritas para outras linguagens por outros grupos. É muito comum utilizar o PHP para fazer conexões com o MySQL, mas no meu site a prioridade é C !
Farei uma pequena abordagem da libmysql, até porque também é novidade para mim !

» Post Completo...

  • mysql_init() - Obtem ou inicializa uma estrutura MYSQL.
  • mysql_close() - Fecha uma conexão com o servidor.
  • mysql_real_connect() - Conecta ao servidor MySQL.
  • mysql_errno() - Retorna o número do erro ocorrido recentemente.
  • mysql_error() - Retorna a mensagem do erro ocorrido recentemente.
  • mysql_real_escape_string() - Escapa caracteres especiais em uma string para ser utilizada em uma instrução SQL.
  • mysql_query() - Executa uma consulta SQL especificada com uma string terminada com null.
  • mysql_real_query() - Executa uma consulta SQL especificada como uma string fixa.
  • mysql_insert_id() - Retorna o ID gerado para uma coluna AUTO_INCREMENT pela consulta anterior.
  • mysql_store_result() - Recupera um resultado completo para o cliente.
  • mysql_fetch_fields() - Retorna um vetor de todas as estruturas do campo.
  • mysql_fetch_lengths() - Retorna o tamanho de todas as colunas na linha atual.
  • mysql_num_fields() - Retorna o número de colunas em um conjunto de resultados.
  • mysql_num_rows() - Retorna o número de linhas em um conjunto de resultados.
  • mysql_fetch_row() - Busca o próximo registro no conjunto de resultados.
  • mysql_field_seek() - Coloca o cursor da coluna em uma coluna específica.
  • mysql_free_result() - Libera a memória usada por um conjunto de resultados.
  • mysql_commit() - Faz um commits na transação.
  • mysql_rollback() - Faz um roll back na transação.
Confira a lista completa no manual da MySQL.

*** Exemplo ***
A seguir, estão em destaque algumas das principais linhas de um exemplo que faz uma consulta no banco. O código completo está disponível aqui !

#include <mysql/mysql.h>
#define host "127.0.0.1"
#define user "banco"
#define senha "senha"
#define banco "banco"

MYSQL *sock = NULL;

int main(void){
//--- socket ---//
sock = mysql_init(0);
...
//--- Conexão ---//
mysql_real_connect(sock,host,user,senha,banco,0,NULL,0);
...
consulta();
...
//--- Fechando a conexão ---//
mysql_close(sock);

return 0;
}

void consulta(){
if( mysql_query(sock,"SELECT * FROM `cliente`") ){
printf("falha: %s.",mysql_error(sock));
}else{
//- solicitando resultado da pesquisa
res = mysql_store_result(sock);
if(res){
num_fields = mysql_num_fields(res);
//--- listando dados ---//
while( (row = mysql_fetch_row(res)) ){
lengths = mysql_fetch_lengths(res);
for(i=0; i<num_fields; i++){
printf("%.*s ", (int)lengths[i], row[i]?row[i]:"NULL");
}
printf("\n");
}
mysql_free_result(res);
}else
printf("Erro: %s\n",mysql_error(sock));
}
}


*** Testando ***

$ make
gcc -o mysql_teste mysql_teste.c `mysql_config --cflags --libs`
$ ./mysql_teste
socket... ok.
conexao... ok.
codificacao: latin1
status: Uptime: 17988 Threads: 1 Questions: 377 Slow queries: 0 Opens: 136 Flush tables: 1 Open tables: 18 Queries per second avg: 0.021

linhas: 2
[cod] [nome] [dt_cadastro] [tipo_compra] [em_parcelam] [em_vencim]
1, João Pessoa Filho, 2007-10-07, comum, 0.00, 0.00
2, Maria da Conceição Batista, 2007-10-07, comum, 0.00, 0.00


*** Link's ***
---
Não foi grande coisa, mas é por aí que as coisas funcionam. Em PHP você faria em quantas linhas ?! Com menos de um terço talvez, mas em momento algum eu estive comparando isso.
Em breve, um outro post sobre como tornar esta aplicação visual. E todo este código em c fará mais sentido !

terça-feira, 2 de outubro de 2007

Vídeo Compiz Fusion (Desktop 3D)

Eu poreria escrever um texto enorme sobre o Linux, mas uma imagem vale mais do que mil palavras !


Os efeitos do vídeo acima são de versões em desenvolvimento do Compiz Fusion (o resultado da fusão do Beryl com o Compiz), e foram divulgados em julho.
É bem provável que venha junto com a versão 7.10 do Ubuntu !

---
Esse vídeo é d++ !!!