segunda-feira, 25 de novembro de 2013

Tcl e Freewrap

Recebi a incumbência de escrever um pequeno programa para corrigir alguns arquivos de configuração. Os requisitos eram estes:
  1. Rodar em Windows;
  2. Ser um executável sem dependências externas (principalmente, não depender de uma VM);
  3. Alterar o valor da coluna 114 para 4 em todas as linhas;
  4. Gravar uma cópia do arquivo original.
Pareceu-me uma boa oportunidade de usar o Tcl. Desta vez, sem o Tk. Com o Freewrap, posso rapidamente criar um executável.
O script abaixo mostra como é simples a tarefa com Tcl, mas é o Freewrap que torna a aplicação da linguagem interessante no Windows.

if {$argc<1} {
  puts "Uso: setcol arquivo";
  exit
}

set filename [lindex $argv 0]

proc replace {filename} {
  set in  [open $filename]
  set out [open "$filename.temp" w]

  while {[gets $in line] >= 0} {
    puts $out [string replace $line 113 113 4]
  }
  
  close $in
  close $out
  file delete "$filename.bak"
  file rename $filename "$filename.bak"
  file rename "$filename.temp" $filename
}

if [catch {replace $filename} result] {
  puts stderr "Cuidado: $result"
  exit
}


A força do Freewrap para este tipo de problema (uma solução para uma máquina remota com poucos recursos de software) é que ele permite agregar binários adicionais ao pacote. Então, posso enviar um script e vários binários acessórios sem nenhum esforço. Posso também criar uma interface gráfica com Tk para facilitar o uso de algum binário por um operador leigo. E o resultado vai rodar em qualquer versão do Windows (talvez não no Windows 3.11, mas, sem testar, não é possível excluir a possibilidade).

Este cenário é dos mais simples e gerar o executável é uma questão apenas de digitar o seguinte comando:

freewrapTCLSH setcol.tcl

Isso produz um arquivo chamado setcol.exe com aproximadamente 2,3MB. Essa versão do freewrap não inclui o Tk. Com ele, o executável teria mais de 4MB.

Um comentário:

Heloísa disse...

Muito útil!! O programa está sendo bem utilizado. Agora quero automatizar a execução, de repente dá outro post. :-)