Argumentos de linha de comando com a GLib

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.

Tagged ,

Gnopaste – Cliente Gtk+ para o pastebin.com

Alguns dias atrás, resolvi que estava na hora de fazer algo concreto, aplicar meus conhecimentos em algo que seja útil e me fizesse aprender mais coisas, enfrentar novos desafios. Assim surgiu a ideia de desenvolver o Gnopaste, um pequeno aplicativo que pretende ser um cliente Gtk+ para o serviço pastebin.com, que tenho utilizado com certa frequência. Já comecei a definir algumas coisas da “arquitetura” e interface do “bixo” e tentarei expor minhas decisões e desafios aqui.

O projeto está hospedado no GitHub.com e o link para o mesmo encontra-se no fim deste post.

Inicialmente, pretendo empregar neste projeto Gtk+ 3.0, Vala e a libsoup.

Em breve postarei mais informações, sobre a interface e decisões tomadas no projeto.

Página do projeto: https://github.com/diegotoral/Gnopaste
Tagged , , ,

Gjs Hello World

Pequena e simples aplicação escrita em javascript e Gtk+, utilizando o gobject-introspection. Deu bastante trabalho, visto que não existe muita documentação sobre o assunto. Espero poder gerar alguma documentação básica, talvez em forma de “snippets”, e compartilhar com os interessados.


const Gtk = imports.gi.Gtk;
const GLib = imports.gi.GLib;

// Initialize the gtk
Gtk.init(0, null);

let mwindow = new Gtk.Window ({type : Gtk.WindowType.TOPLEVEL});
let label = new Gtk.Label ({label : "Hello World"});

// Set the window title
mwindow.title = "Hello World!";
mwindow.connect ("destroy", function(){Gtk.main_quit()});

// Add the label
mwindow.add (label);

// Show the widgets
label.show ();
mwindow.show();

Gtk.main();

Alguns links interessantes:

Até a próxima! o/

Tagged , , ,

Hello World

Como “primeira” postagem neste blog resolvi que seria interessante, ou não, iniciar com alguns exemplos de “Hello World” nas linguagens que mais utilizo, gosto ou estou estudando. Sendo assim, deixemos de falação e vamos ao código…

Versão em C:


#include

int
main (int argc, char *argv[])
{
	printf ("Hello World!\n");
	return 0;
}

Versão em PHP:

<?php
    echo 'Hello World!';
?>

Versão em Vala:

using GLib;

public class HelloWorld : GLib.Object
{
	public static int main (string[] args)
	{
		stdout.printf ("Hello, World\n");
		return 0;
	}
}
Tagged , , , ,
Follow

Get every new post delivered to your Inbox.