Bunch of edits

* Make truncater rather readable and indented (hope you won't mind!)
* List people in CREDITS (ask to get your name removed or changed)
* Make README better
This commit is contained in:
Erkin Batu Altunbaş 2012-05-12 19:57:55 +02:00
parent 8da0695c47
commit cc0ddd7c74
4 changed files with 116 additions and 121 deletions

View file

@ -1,7 +1,7 @@
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004 Version 2, December 2004
Copyright (C) 2012 Sven-Hendrik Haase, Jan Alexander Steffens and Erkin Batu Altunbaş Copyright (C) 2012 Erkin Batu Altunbaş
Everyone is permitted to copy and distribute verbatim or modified Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long copies of this license document, and changing it is allowed as long

16
CREDITS Normal file
View file

@ -0,0 +1,16 @@
# Pretty much all the contributors in alphabetic order.
# Active developers
Erkin Batu Altunbaş
Jan Alexander Steffens
Mattias Andrée
Sven-Hendrik Haase
# Patchers and other contributors
Duane Bekaert
Elis
James Ross-Gowan
Jannis
Kyah Rindlisbacher
Louis Taylor
Pablo Lezaeta

View file

@ -1,22 +1,23 @@
`ponysay` - A cowsay wrapper with ponies. `ponysay` - A cowsay wrapper for ponies.
![Derp](http://i.imgur.com/xOJbE.png) ![Derp](http://i.imgur.com/xOJbE.png)
Today your terminal, tomorrow the world! Today your terminal, tomorrow the world!
Installation on Linux (or other Unix) Installation on Linux (or other Unix)
------------------------------------- -------------------------------------
If you do not already have `cowsay` you will need to install it First of all, you need `cowsay` from your local repositories.
Obtain it from [here](http://www.nog.net/~tony/warez/cowsay.shtml) if you wish to compile it yourself.
apt-get install cowsay # assuming dpkg [Download](https://github.com/erkin/ponysay/downloads) or clone the project.
In the terminal, `cd` into the ponysay directory and `make install`.
[Download](https://github.com/erkin/ponysay/downloads) the latest project. In the terminal, `cd` into the ponysay directory and run This will install ponysay into the $PREFIX (`/usr` by default, meaning you may need to make as root).
sudo make In order to use ponysay, run:
This will install ponysay into the $PREFIX (`/usr` by default). In order to use ponysay, run ponysay "I am just the cutest pony!"
ponysay "I am just the cutest pony"
Or if you have a specific pony in your mind: Or if you have a specific pony in your mind:
@ -24,9 +25,7 @@ Or if you have a specific pony in your mind:
### Pony fortune on terminal startup ### Pony fortune on terminal startup
This requires that you have the `fortune` utility installed This requires that you have the `fortune` utility installed. You can install it from your repositories or just fetch the source code from [here](ftp://ftp.ibiblio.org/pub/linux/games/amusements/fortune/).
apt-get install fortune
You can try [this](http://www.reddit.com/r/mylittlelinux/comments/srixi/using_ponysay_with_a_ponified_fortune_warning/) script to ponify fortunes. You can try [this](http://www.reddit.com/r/mylittlelinux/comments/srixi/using_ponysay_with_a_ponified_fortune_warning/) script to ponify fortunes.

View file

@ -1,57 +1,36 @@
/** /* ponysaytruncater
* ponysaytruncater Output truncater used by ponysay to stop large ponies from being printed badly. * Output truncater used by ponysay to stop
* large ponies from being printed badly.
* *
* DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE * Licensed under WTFPL
* See COPYING for details * See COPYING for details
*/ */
#include <stdio.h> #include <stdio.h>
#define String char* #define String char*
#define boolean char #define boolean char
#define true 1 #define true 1
#define false 0 #define false 0
/* Stdin file descriptor ID */
/**
* Stdin file descriptor ID
*/
#define STDIN 0 #define STDIN 0
/* The number of columns on the current line */
/**
* The number of columns on the current line
*/
static int x = 0; static int x = 0;
/** /* Escape sequence state */
* Escape sequence state
*/
static int esc = 0; static int esc = 0;
/** /* Last bytes as written */
* Last bytes as written
*/
static boolean ok = true; static boolean ok = true;
void write(char b, int width); void write(char b, int width);
int toInt(String string); int toInt(String string);
/* Mane method!
/**
* <p>Mane method!</p>
* <p>
* The only argument, in addition to the executed file, * The only argument, in addition to the executed file,
* should be the width of the terminal which you get by * should be the width of the terminal which you get by
* adding <code>`tput cols || echo 0`</code> as and argument. * adding <code>`tput cols || echo 0`</code> as and argument.
* </p>
* *
* @param argc The number of startup arguments * @param argc The number of startup arguments
* @param argv The startup arguments, the first is the file itself * @param argv The startup arguments, the first is the file itself
@ -60,115 +39,116 @@ int toInt(String string);
*/ */
void main(int argc, String* argv) void main(int argc, String* argv)
{ {
int width = 0; int width = 0;
if (argc > 1) if (argc > 1)
width = toInt(*(argv + 1)); width = toInt(*(argv + 1));
char b = 0; char b = 0;
if (width > 15) //sanity if (width > 15) /* sanity */
while (read(STDIN, &b, 1)) while (read(STDIN, &b, 1))
write(b, width); write(b, width);
else else
while (read(STDIN, &b, 1)) while (read(STDIN, &b, 1))
printf("%c", b); printf("%c", b);
} }
/* Writes a character to stdout, iff it fits within the terminal
/**
* Writes a character to stdout, iff it fits within the terminal
* *
* @param b The character (byte) to write * @param b The character (byte) to write
* @param width The width of the terminal * @param width The width of the terminal
*/ */
void write(char b, int width) void write(char b, int width)
{ {
int i; int i;
char nx; char nx;
if (esc == 0) if (esc == 0)
{ {
if (b == '\n') if (b == '\n')
{ {
if (x >= width) if (x >= width)
{ {
// Reset background colour /* Reset background colour */
write('\e', width); write('\e', width);
write('[', width); write('[', width);
write('4', width); write('4', width);
write('9', width); write('9', width);
write('m', width); write('m', width);
} }
x = -1; x = -1;
} }
else if (b == '\t') else if (b == '\t')
{ {
// Tab to next pos ≡₈ 0 /* Tab to next pos ≡₈ 0 */
nx = 8 - (x & 7); nx = 8 - (x & 7);
for (i = 0; i < nx; i++) for (i = 0; i < nx; i++)
write(' ', width); write(' ', width);
return; //(!) return; /* (!) */
} }
else if (b == '\e') else if (b == '\e')
esc = 1; esc = 1;
} }
else if (esc == 1) else if (esc == 1)
{ {
if (b == '[') esc = 2; //CSI ends with a letter, m is for colour /* CSI ends with a letter, m is for colour
else if (b == ']') esc = 3; //OSI, OSI P is for palett editing in Linux VT OSI, OSI P is for palett editing in Linux VT */
else esc = 10; //Nothing to see here, move along if (b == '[') esc = 2;
else if (b == ']') esc = 3;
else esc = 10; /* Nothing to see here, move along */
} }
else if (esc == 2) else if (esc == 2)
{ {
if ((('a' <= b) && (b <= 'z')) || (('A' <= b) && (b <= 'Z'))) if ((('a' <= b) && (b <= 'z')) || (('A' <= b) && (b <= 'Z')))
esc = 10; esc = 10;
} }
else if ((esc == 3) && (b == 'P')) else if ((esc == 3) && (b == 'P'))
{ {
esc = ~0; esc = ~0;
} }
else if (esc < 0) else if (esc < 0)
{ {
esc--; esc--;
if (esc == ~7) if (esc == ~7)
esc = 10; esc = 10;
} }
else else
esc = 10; esc = 10;
if ( // Can be printed: if (
(x < width) || // within bounds /* Can be printed:
(esc != 0) || // escape sequence within bounds
(ok && ((b & 0xC0) == 0x80))) // last with printed ∧ not first byte in character escape sequence
last with printed not first byte in character */
(x < width) ||
(esc != 0) ||
(ok && ((b & 0xC0) == 0x80)))
{ {
printf("%c", b); printf("%c", b);
if ((esc == 0) && ((b & 0xC0) != 0x80)) // Count up columns of not in escape sequnce and if ((esc == 0) && ((b & 0xC0) != 0x80))
x++; // the byte is not the first byte in the character /* Count up columns of not in escape sequnce and */
ok = true; x++; /* the byte is not the first byte in the character */
ok = true;
} }
else else
ok = false; ok = false;
if (esc == 10) if (esc == 10)
esc = 0; esc = 0;
} }
/* Converts a string to an integer
/**
* Converts a string to an integer
*
* @param string The string to convert * @param string The string to convert
* @return The integer represented by the string * @return The integer represented by the string
*/ */
int toInt(String string) int toInt(String string)
{ {
int rc = 0; int rc = 0;
String str = string; String str = string;
char c = 0; char c = 0;
while ((c = *str++) != 0) while ((c = *str++) != 0)
rc = (rc << 1) + (rc << 3) - (c & 15); rc = (rc << 1) + (rc << 3) - (c & 15);
return -rc; return -rc;
} }