ponysay/Truncater.java
2012-05-03 15:05:53 +02:00

150 lines
2.8 KiB
Java

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;
}
}
}