Desenvolver um programa que seja capaz de entender argumentos de linha de comando, pode ser uma tarefa bastante tediosa e até mesmo representar um grande desperdício de tempo, principalmente quando se trata de um projeto da faculdade com o deadline apertado. Por esse motivo, e alguns outros, é interessante conhecer e dominar ferramentas e bibliotecas que te auxiliem nessa tarefa. Neste post estarei demonstrando como utilizar o GOption commandline parser da GLib em seus programas. O Exemplo que apresento abaixo não é muito diferente do apresentado na documentação oficial da biblioteca.
Algumas características interessantes do parser são:
- Fácil utilização e integração com programas já existentes.
- Suporta opções curtas (apenas uma letra) e longas.
- Oferece suporte a internacionalização.
- Gera automaticamente a saída do comando -h (help).
- Suporte a funções callback para processamento dos argumentos.
/* compile with: gcc -Wall commandline.c -o commandline `pkg-config --cflags --libs glib-2.0` */
#include <stdlib.h>
#include <glib.h>
static gint repeats = 0;
static gboolean beep = FALSE;
static GOptionEntry entries[] =
{
{ "repeats", 'r', 0, G_OPTION_ARG_INT, &repeats, "Print something N times on the sreen", "N" },
{ "beep", 'b', 0, G_OPTION_ARG_NONE, &beep, "Print a beep once", NULL },
{ NULL }
};
int
main (int argc, char *argv[])
{
GError *error = NULL;
GOptionContext *context;
context = g_option_context_new ("- simple example of command line parse with glib");
g_option_context_add_main_entries (context, entries, NULL);
if (!g_option_context_parse (context, &argc, &argv, &error))
{
g_print ("option parsing failed: %s\n", error->message);
exit (1);
}
if (beep)
{
g_print ("echoing a beep... \a\n");
exit (0);
}
if (repeats > 0)
{
gint i;
g_print ("echoing %d time...\n", repeats);
for (i = 0; i < repeats; i++)
{
g_print ("\techoing something...\n");
}
exit (1);
}
exit (0);
}
Como é possível obeservar no código acima, qualquer programa pode suportar argumentos de linha de comando sem um grande esforço e até mesmo modificações. Em poucas linhas de código, é possível realizar o tratamento de inúmeros parâmetros.
Um ponto interessante, e que não poderia deixar de comentar, é a necessidade de fornecer um array null terminated como argumento da função g_option_context_add_main_entries, ou seja, o último elemento do array deve ser null. Na GLib, e em bibliotecas C em geral, este tipo de prática é bastante comum.