March 25th, 2008

Handler de funcoes em C

Qd se faz um programa que compara a entrada padrao (ou parte dela) com varios comandos/funcoes

é comum pensar primeiro em if e logo em seguida em case.

Mas isso alem de ser ‘feio’ e complicar a leitura/compreensao do codigo, torna dificil sua manutencao.

Para isso existe o conceito de handler de funcoes, onde se cria uma estrutura com 2 campos:

o nome da funcao que sera utilizado para fazer o match com o comando (o nome do comando deve ser o mesmo que o comando informado), e um campo void que é um ponteiro para a funcao propriamente dita:

1
2
3
4
5
6
7
8
typedef struct {
   char *name;
   void (*func)(char *what, char *which, int connfd);
} handler_t;
 
const handler_t handlers[] = {
       {"add","add"}, {NULL}
};

crei um estrutura (handler_t) com o campo ‘name’, e o campo ‘(*func)’ o
‘(char *what, char *which, int connfd);’ sao os argumentos da funcao, claro q vc deve alterar para as suas necessidades.
logo em seguida eu defini um vetor do tipo ‘handler_t’ (minha estrutura) que contem um unico comando dentro:
add. Neste caso coloquei o name com o mesmo nome da funcao, isso pq claro, a funcao tem nome ‘add’.
agora pra fazer o match eh o mais simples:

1
2
3
4
5
for(i=0; handlers[i].name != NULL; i++)
{
	if(strcmp(handlers[i].name, cline.cmd) >= 0)
        	handlers[i].func(cline.what, cline.which);
}

Ou seja, ele cai na iteracao, e enquanto o campo ‘name’ nao for NULL, ele vai andando pelo vetor, e comparando o que encontra dentro do campo ‘name’ com o cline.cmd (outra estrutura que é alimentada por outra parte do codigo, mas imagine o seguinte: cline.cmd é o comando em questao, add, remove ou qq outro q vc configurou). qd o comando ‘add’ for encontrado ele vai executar a funcao com os argumentos (que foram tratados em outra parte do codigo).

Pronto, codigo limpo, economia de linhas, e facilimo para adcionar ou remover um ou outro comando/funcao. Basta editar o vetor handlers com o nome apropriado da funcao :) e claro certificarse que a funcao exista no codigo.

Thanks to Froz :)

c
programming

Comments (1)

Permalink

todo/get_field.py

sim, funcionou….
no .muttrc:

1
2
macro index < Esc>w "|formail  -x Subject: -x From: | get_field.py | todo -a -p 4\r"
macro pager  < Esc>w "|formail  -x Subject: -x From: | get_field.py | todo -a -p 4\r"

tem q ter o procmail (pra usar o formail):

1
sudo aptitude install procmail

get_field.py:

1
2
3
4
5
6
7
8
#!/usr/bin/env python
 
import sys
from email.Header import decode_header
 
for f in sys.stdin.readlines():
        field=decode_header(f)
        print field[0][0]

admin stuff
Desktop

Comments (0)

Permalink

K.I.S.S.

Usei evolution durante algum tempo.

Mas depois de gmail, yahoo mail etc, vc ve que nao precisa realmente de um cliente de email, apenas um browser para acessar o seu webmail.

No meu caso eu centralizo tdo no gmail (baixo tdo das outras contas via pop3, e redireciono as contas @hal.vu para o gmail, fazendo o download das mesmas depois com o fetchmail no server da dreamhost, mantendo um backup de todas as contas de email que existe no gmail, no server da dreamhost). Gosto bastante da interface do gmail (quem nao gosta?) e ainda existem alguns add-ons do ff para usar com ele. Um dos mais legais é o Better Gmail 2.

Para o email do trabalho mesmo (que até tem o webmail , mas é aquele do exchange) eu utilizo o mutt. Sim, o mutt mesmo, aquele ‘em texto’. Alguns dos motivos sao:

-Utilizo as minhas teclas de atalho customizadas ou padrao dele mesmo, posso navegar nas mensagens como navego no vim, ou como quizer.
-Utilizo o proprio vim para editar mensagens.
-Configuro os meus cabecalhos.
-Assino/criptografo mensagens somente com as teclas de atalhos.
-Integracao com o abook.

Entre varias outras… aproveitando só pegar o meu .muttrc.

Mas eu ainda nao tinha um ‘todo manager’.
Foi entao que descobri o devtodo.
Pq usar este cara ?
Novamente, simplicidade.

As vantagens incluem:

-absurdamente facil de adcionar remover ou ler um todo. vc pode por ex. pressionar alt+esc (alt+F2 no gnome) e digitar, todo -a “entrar em contato com o banco para sanar divida”
- salva em xml
-aceita varias (senao todas) operacoes em uma unica linha de comando.
alias acabei de pensar em algumas bindkeys novas para o mutt, como por ex transformar um email em uma entrada ‘todo’… vou la testar.

Desktop

Comments (0)

Permalink

CB

[www@cb.vu]~> ls -l
-rw-r—–   1 colin   www   1045 Feb 15 01:31 about.txt
-rw-r—–   1 colin   www   4033 Feb 11 02:06 cb.txt
-rw-r—–   1 colin   www  98166 Jul 23  2004 exploring.gif
-rw-r—–   1 colin   www   1150 Jan 31 15:17 favicon.ico
-rw-r—–   1 colin   www   1933 Feb 10 16:53 index.html
-rw-r—–   1 colin   www  25695 Feb  5 00:52 shell.js
-rw-r—–   1 colin   www    766 Feb 10 01:13 sitemap.xml
-rw-r—–   1 colin   www  64720 Feb 10 01:13 termlib.js
-rw-r—–   1 colin   www   5838 Feb 10 02:14 termlib_parser.js
-rw-r—–   1 colin   www 272458 Feb 10 02:14 unixtoolbox.book.pdf
-rw-r—–   1 colin   www 271664 Feb 10 02:14 unixtoolbox.book2.pdf
-rw-r—–   1 colin   www 345472 Feb 10 02:14 unixtoolbox.pdf
-rw-r—–   1 colin   www 124113 Feb 25 04:20 unixtoolbox.txt
-rw-r—–   1 colin   www 156225 Feb 11 01:47 unixtoolbox.xhtml
-rw-r—–   1 colin   www   1992 Feb 11 02:50 vars.js.php
[www@cb.vu]~> more about.txt
Welcome to my website cb.vu!
This site provides a virtual shell and is meant to be a command line joke where
you have to use some UNIX commands to get around. There are some
functionalities which are not totally fake, like the commands ping, whereami,
weather. Besides ping and weather, there is no communication whatsoever between
the browser and the server. Everything is happening within your navigator. You
can however create files on the web root directory and even view them with the
browser by entering the file name in the address bar. For example try:
echo ”Hello there, my name is Colin.” > hello.txt
 – MORE –  (Type: space to continue, ’q' to quit)

O site do cara do post anterior é bemmm legal tb.

admin stuff
Desktop
Server

Comments (0)

Permalink

UnixToolBox

Falando sobre receitas de bolo.

Achei em um share do google reader, uma url que pode ser util, o Unix ToolBox, com comandos de varios unixes (linux/bsd/solaris) e até de windows, alem de nocoes basicas em linguagens de programacao, utilidades de redes, entre outros. Vale ter no bookmarks.

admin stuff
Server

Comments (0)

Permalink

UNetbootin

É dificil de acompanhar estes assuntos….

Me lembro qd era necessario (pra mim, até hoje),  sempre seguir uma receita de bolo para colocar uma distro linux em um pendrive usb (sticky), pois nunca me lembrava como fazer (nao faco tantas vezes assim). Mas pra este caso existe o UNetbootin que faz tdo isso de dentro do windows.

admin stuff

Comments (0)

Permalink

Installing Debian From Ubuntu or any other GNU/Linux

É engracado como sempre encontramos em ferramentas que utilizamos todos os dias uma funcionalidade nova.

Por ex. Para instalar um debian de dentro de qq ubuntu, ou de qq outro linux eu normalmente baixaria o debootstrap.

Mas existe uma maneira bem simples de fazer isso, tdo bem q vc precisa reiniciar o sistema.

Mas mesmo assim, um conceito interessante.

Tratasse de colocar o initrd.gz e o vmlinuz (alem do iso q ira usar na instalacao) dentro de um diretorio qualquer, depois configure uma entrada para eles no seu boot loader…

Ao invez de reproduzir tdo o artigo, vou so dar o link .

admin stuff
ubuntu

Comments (0)

Permalink

WWII

Me interesso razoavelmente em assuntos de guerra/ estrategias.

O que gosto bastante de fazer é assistir videos/filmes sobre a segunda guerra, alem de ler sobre o assunto…

Se alguem curte podem dar uma olhada no documentario (em ingles) da THC sobre a batalha de Slatingrado, e tb sobre a batalha de Berlin.

Stalingrado:

Berlin:

war

Comments (0)

Permalink