Justificador de texto em 80 colunas
Publicado por Enzo de Brito Ferber (última atualização em 22/01/2013)
[ Hits: 7.248 ]
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;
}
Alfabeto escrito 30 vezes e operação XOR
Números de caracteres em arquivo
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
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
O programa assinador digital (1)
PIP3 - erro ao instalar módulo do mariadb para o Python (9)
É normal não gostar de KDE? (8)
dpkg: erro: gatilho de arquivo duplicado chamado pelo arquivo de nome (6)









