Justificador de texto em 80 colunas
Publicado por Enzo de Brito Ferber (última atualização em 22/01/2013)
[ Hits: 7.254 ]
Homepage: http://www.maximasonorizacao.com.br
Download 1358116595.just.tar (versão 2)
Hoje eu precisei justificar um texto em 80 colunas (como o man do Linux), mas não achei nenhum programa built-in pra fazer. Então, depois de procurar muito, achei uma thread que dizia que o emacs fazia isso.... Odeio o emacs.
Então fiz o programa pra trabalhar em conjunto com o fmt do GNU/Linux.
Fica assim:
$ fmt -w 79 arquivo | ./just
O just coloca tudo em 80 colunas, usando apenas espaços. Bem legal e resolveu meu problema. Pra ficar melhor é só colocar na ~/bin
Versão 2 - Enviado por Enzo de Brito Ferber em 13/01/2013
Changelog: Agora funciona normalmente com fmt -80 | just.
Adicionada apenas 1 linha na função formatline() para consertar o bug de formatação.
Quando uma linha tinha exatamente o tamanho desejado, o programa ainda assim adicionava 1 espaço a mais, fazendo com que a linha ficasse fora de formato.
if ( line[ strlen(line) - 1] != '\n' ) return line;
/*
* just.c
*
* Extention for 'fmt' unit command to justify the text
* to 'n' columns
*
* $ fmt -w 79 file | just
*
*
* Author: Enzo Ferber
* : enzoferber@gmail.com
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define LINESIZE 80
#define CUTSIZE 55
/*
* @ insertchar (str, pos, c )
*
* Insert character at given string positing
*
* - str : pointer to the string
* - pos : the position to insert
* - c : character to insert
*/
char *insertchar ( char *str, int pos, char c )
{
register int i;
int len = strlen(str);
// open space for the new character
for ( i = len; i >= pos; i-- )
str[i + 1] = str[i];
// puts new character
str[pos] = c;
// end of string terminator
str[len + 1] = 0x0;
// return
return str;
}
/*
* @ formatline ( line, ls )
*
* Format the line inserting spaces in it
*
* - line: pointer to the line string
* - ls : line size - PUT THE SAME NUMBER AS IN 'fmt' -w argument
*/
char *formatline ( char *line, int ls )
{
register int i;
/*
* if it's just a new line
*/
if ( line[0] == '\n') return line;
/*
* format
*/
for ( i = 0 ; i < strlen(line); i ++)
{
if ( strlen(line) >= ls ) break;
else if ( line[i] == ' ' )
line = insertchar(line, i++, ' ' );
}
/*
* maybe just one run didn't work...
* run the routine to put spaces again
*
* i.e.: strings with low spaces number
*/
if ( strlen(line) < ls )
line = formatline( line, ls );
return line;
}
int main ( void )
{
char *line = (char *)malloc(LINESIZE * sizeof(char));
while ( fgets(line, LINESIZE, stdin) != NULL )
{
printf( "%s", (strlen(line) > CUTSIZE) ?
formatline(line, LINESIZE) : line);
memset(line, 0x0, LINESIZE );
}
free ( line );
return 0;
}
Pequeno simulador de Banco de Dados
Barra de progresso em forma de “roda”
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?









