mirror of
https://github.com/erkin/ponysay.git
synced 2025-02-18 02:24:21 +01:00
truncates the output to the width of stderr
This commit is contained in:
parent
c9c429c3ae
commit
bde7ac5023
1 changed files with 150 additions and 0 deletions
150
Truncater.java
Normal file
150
Truncater.java
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
import java.io.*;
|
||||||
|
|
||||||
|
public class Truncater
|
||||||
|
{
|
||||||
|
public static void main(final String... args) throws IOException
|
||||||
|
{
|
||||||
|
final int width;
|
||||||
|
if ((width = getWidth()) > 15) //sanity
|
||||||
|
{
|
||||||
|
final OutputStream stdout = new BufferedOutputStream(System.out);
|
||||||
|
OutputStream out = new OutputStream()
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The number of column on the current line
|
||||||
|
*/
|
||||||
|
private int x = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Escape sequence state
|
||||||
|
*/
|
||||||
|
private int esc = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Last bytes as written
|
||||||
|
*/
|
||||||
|
private boolean ok = true;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void write(final int b) throws IOException
|
||||||
|
{
|
||||||
|
if (this.esc == 0)
|
||||||
|
{
|
||||||
|
if (b == '\n')
|
||||||
|
{
|
||||||
|
if (x >= width)
|
||||||
|
{
|
||||||
|
write('\033');
|
||||||
|
write('[');
|
||||||
|
write('4');
|
||||||
|
write('9');
|
||||||
|
write('m');
|
||||||
|
}
|
||||||
|
this.x = -1;
|
||||||
|
}
|
||||||
|
else if (b == '\t')
|
||||||
|
{
|
||||||
|
int nx = 8 - (x & 7);
|
||||||
|
for (int i = 0; i < nx; i++)
|
||||||
|
write(' ');
|
||||||
|
return; //(!)
|
||||||
|
}
|
||||||
|
else if (b == '\033')
|
||||||
|
this.esc = 1;
|
||||||
|
}
|
||||||
|
else if (this.esc == 1)
|
||||||
|
{
|
||||||
|
if (b == '[') this.esc = 2;
|
||||||
|
else if (b == ']') this.esc = 3;
|
||||||
|
else this.esc = 10;
|
||||||
|
}
|
||||||
|
else if (this.esc == 2)
|
||||||
|
{
|
||||||
|
if ((('a' <= b) && (b <= 'z')) || (('A' <= b) && (b <= 'Z')))
|
||||||
|
this.esc = 10;
|
||||||
|
}
|
||||||
|
else if ((this.esc == 3) && (b == 'P'))
|
||||||
|
{
|
||||||
|
this.esc = ~0;
|
||||||
|
}
|
||||||
|
else if (this.esc < 0)
|
||||||
|
{
|
||||||
|
this.esc--;
|
||||||
|
if (this.esc == ~7)
|
||||||
|
this.esc = 10;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
this.esc = 10;
|
||||||
|
|
||||||
|
if ((x < width) || (this.esc != 0) || (ok && ((b & 0xC0) == 0x80)))
|
||||||
|
{
|
||||||
|
stdout.write(b);
|
||||||
|
if (this.esc == 0)
|
||||||
|
if ((b & 0xC0) != 0x80)
|
||||||
|
x++;
|
||||||
|
ok = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ok = false;
|
||||||
|
if (this.esc == 10)
|
||||||
|
this.esc = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void flush() throws IOException
|
||||||
|
{
|
||||||
|
stdout.flush();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
System.setOut(new PrintStream(out));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
InputStream in = System.in;
|
||||||
|
OutputStream out = System.out;
|
||||||
|
|
||||||
|
for (int d; (d = in.read()) != -1;)
|
||||||
|
out.write(d);
|
||||||
|
out.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the width of the terminal
|
||||||
|
*
|
||||||
|
* @return The width of the terminal
|
||||||
|
*/
|
||||||
|
public static int getWidth()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Process process = (new ProcessBuilder("/bin/sh", "-c", "tput cols 2> " + (new File("/dev/stderr")).getCanonicalPath())).start();
|
||||||
|
String rcs = new String();
|
||||||
|
InputStream stream = process.getInputStream();
|
||||||
|
int c;
|
||||||
|
while (((c = stream.read()) != '\n') && (c != -1))
|
||||||
|
rcs += (char)c;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
stream.close();
|
||||||
|
}
|
||||||
|
catch (final Throwable err)
|
||||||
|
{
|
||||||
|
//Ignore
|
||||||
|
}
|
||||||
|
return Integer.parseInt(rcs);
|
||||||
|
}
|
||||||
|
catch (final Throwable err)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue