--- /dev/null
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+\f
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
--- /dev/null
+LEX = flex
+BUILD = jethro kraut cockney jive nyc ken ky00te newspeak nethackify scramble
+OTHER = eleet b1ff chef jibberish upside-down rasterman studly fudd \
+ censor spammer uniencode pirate kenny scottish fanboy
+CFLAGS = -O2 -lfl
+export CFLAGS
+INSTALL_PROGRAM = install
+
+# DEB_BUILD_OPTIONS suport, to control binary stripping.
+ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
+INSTALL_PROGRAM += -s
+endif
+
+# And debug building.
+ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS)))
+CFLAGS += -g
+endif
+
+all: $(OTHER) $(BUILD) samples
+
+install: $(BUILD) $(OTHER)
+ install -d $(DESTDIR)/usr/games
+ $(INSTALL_PROGRAM) $(BUILD) $(DESTDIR)/usr/games/
+ install $(OTHER) $(DESTDIR)/usr/games/
+ install -d $(DESTDIR)/usr/share/man/man6
+ install -m 0644 filters.6 $(DESTDIR)/usr/share/man/man6
+ cd $(DESTDIR)/usr/share/man/man6 && \
+ $(foreach prog,$(BUILD) $(OTHER),ln -s filters.6 $(prog).6;)
+
+samples: $(BUILD) $(OTHER)
+ -rm -f SAMPLES
+ PATH=.:$$PATH; export PATH; echo $(BUILD) $(OTHER) | xargs -n 1 sh makesample.sh
+
+clean:
+ $(RM) -f core *.o *~ $(BUILD) SAMPLES
+ cd ky00te.dir && make clean
+ rm -f kraut.dir/lex.yy.c
+ cd nethackify.dir && make clean
+ cd scramble.dir && make clean
+
+.SUFFIXES: .l
+
+.l:
+ $(RM) $*.c
+ $(LEX) -t $< > $*.c
+ $(CC) -o $@ $*.c $(CFLAGS)
+ $(RM) $*.c
+
+.SUFFIXES: .dir
+
+.dir:
+ cd $<; make
+
+ky00te:
+ cd ky00te.dir && make
+
+kraut:
+ cd kraut.dir && lex kraut.l
+ cd kraut.dir && $(CC) kraut.c lex.yy.c -o ../kraut
+
+nethackify:
+ cd nethackify.dir && make
+
+scramble:
+ cd scramble.dir && make
--- /dev/null
+This is a collection of filters to do all sorts of strange things to text.
+B1ff, the Swedish Chef, and an eleet filter are included, along with many,
+many more.
+
+http://kitenet.net/~joey/code/filters
+
+Since the original versions of some of these filters have copyright
+problems, I have done a "clean room" re-implementation of the original lex
+filters in perl. I did this without looking at the original code to the
+filters at all, I simply observed their output and drew my own conclusions,
+and wrote my own code. Then I compared the output of the original and new
+filters when ran on large bodies of text, and fixed the things I had
+missed.
+
+Here are the results of my investigations of how the filters work:
+
+eleet:
+ This is the simplest filter to figure out. The letters a-z of
+ the alphabet are replaced with the following letters:
+ 4 b c d 3 f g h 1 j |< l /\/\ /\/ 0 p q r 5 + u \/ \/\/ >< y z
+ Note that the equivalent translation is done on upper-case letters.
+
+fudd:
+
+ This one is trivial too. A few transpositions happen differently if
+ the letter is at the end of the word or not, and I think I found
+ all the transpositions with only a few paragraphs of sample output.
+ The only weird thing is that 'n.' is changed to "n, uh-hah-hah-hah."
+ (Works well with sentances ending in "gun." ..)
+
+chef:
+ Personally my favorite filter. This took a bit of work to figure
+ out, and I doubt I have everything correct. Note that due to a bug
+ or an odd feature of the original program, it doesn't seem to think
+ that the first letter of the first word is really the first letter
+ of a word and so some of the words below don't trigger for that first
+ word. I did not emulate this behavior because I think it's probably a
+ bug.
+
+ The word "bork" is never changed, no matter what any of these
+ rules may say. Neither is "Bork".
+
+ The following translations only happen to letters that are the first
+ letter of a word of at least 2 letters in size:
+ o -> oo
+ O -> Oo
+
+ These happen to letters that are not the last letter of a word:
+ a -> e
+ A -> e
+
+ These translations only happen if the letter is not the first letter
+ of a word:
+ f -> ff
+ i -> ee (but only the first `i' per word)
+ o -> u
+ u -> oo
+
+ These translations always happen:
+ v -> f
+ V -> F
+ w -> v
+ W -> V
+ an -> un
+ An -> Un
+ au -> oo
+ Au -> Oo
+
+ Any occurrence of "e" at the end of a word is changed to "e-a".
+
+ Any occurrence of "e" and the beginning of a word is changed to "i".
+ Same with capitals.
+
+ Any occurrence of "the" is changed to "zee", any occurrence of
+ "The", to "Zee".
+
+ Any occurrence of "tion" in a word, to "shun".
+
+ Any "th" at the end of a word is changed to "t".
+
+ Any "en" at the end of a word is changed to "ee".
+
+ Any "ow" at the end of a word is changed to "oo".
+
+ And of course, after any `.', `?', or `!' that is at the end of a
+ line, the Chef prints out a new line, and then the famous
+ "Bork Bork Bork!", and then another newline.
+
+ Known bugs in this implementation:
+ - says "frunch", not "french".
+ - still quite buggy in general.
+
+b1ff:
+ Unlike the other filters, b1ff does not try to be an exact duplicate
+ of its predecessor.
+
+ After upper-casing everything, b1ff does some word and sub-word
+ substitutions, most of them misspellings.
+
+ B1ff also changes punctuation - All commas become periods; all
+ semicolons, commas. Question and exclamation marks are changed to
+ things like "!!!!1!" and "?!?!?!". It looks like the original filter
+ decided how long a sequence to print based on the text input before
+ the end of sentence. I took a simpler route and just randomized it.
+
+Collected and written by Joey Hess <joey@kitenet.net>
--- /dev/null
+#!/usr/bin/perl -p
+# B1FF filter.
+# Copyright 1999 by Joey Hess under the terms of the GNU GPL.
+
+# I use an array, not a hash. because order is important.
+@trans_table=(
+ '\bEVERYONE\b' => 'EVRY 1',
+ '\bEVERYBODY\b' => 'EVRY BUDY',
+ '\bEVERY\b' => 'EVRY',
+ '\bONE\b' => '1',
+ '\bAND\b' => '+',
+ '\bYOU' => 'U',
+ '\bITS\b' => 'IT"S',
+ '\bIT\'S\b' => 'ITS',
+ '\bIS\b' => 'IZ',
+ '\bLINUX\b' => 'LINUS',
+ '\bUNIX\b' => 'THE MANEFRA1M O/S',
+ '\bWINDOWS\b' => 'WINDOWZ (IT RULEZ MAN!)',
+ '\bYOU\'RE\b' => 'YOUR',
+ '\bTHEM\b' => 'THUM',
+ '\bHERE\b' => 'HERE',
+ '\bTHEY\'RE\b' => 'THE1R',
+ '\bTHEIR\b' => 'THERE',
+ '\bWAS\b' => 'WUZ',
+ '\bMACINTOSH\b' => 'IMAC', # too 90's?
+ '\bVERY\b' => 'TOTALLY',
+ '\bCOMPUTER\b' => 'VIC-20',
+ '\bWHETHER\b' => 'WHETHUR',
+ '\b(?:H|CR)ACKER\b' => 'KEWL HACKER D00D!',
+ '\bOF\b' => 'UV',
+ '\bGNU\b' => 'NEW',
+ '\bQUITE\b' => 'REAL',
+ '\bFREE\b' => 'FREE!',
+
+ 'HOME' => 'HUM',
+ 'COME' => 'CUM',
+ 'MICRO' => 'MIKRO',
+ 'GOVERN' => 'GUVERN',
+ 'PERSON' => 'D00D',
+ 'SOME' => 'SUM',
+ 'WRITE' => 'RITE',
+ 'REAL' => 'REEL',
+ 'LITE' => 'L1TE',
+ 'BIAN' => 'B1AN',
+ 'TION' => 'SHUN',
+ 'FOR' => '4',
+ 'TO' => '2',
+ 'ATE' => '8',
+ '\b2TALLY\b' => 'TOTALY', # fix from line above
+ 'LL' => 'L',
+ 'OO' => '00',
+ 'MATE' => 'M8',
+ 'ER' => 'UR',
+ 'S+\b' => 'Z',
+ 'KN' => 'N',
+ 'IE' => 'EI',
+);
+
+$_=uc;
+s/;/,/g;
+s/'//g;
+
+while (@trans_table) {
+ $key=shift @trans_table;
+ $value=shift @trans_table;
+ s/$key/$value/g;
+}
+
+s/(\!+)/$1.make_exclimation()/eg;
+s/(\?+)/$1.make_question()/eg;
+s/I/rand 3 > 2 ? '1' : 'I'/eg; # change 1/3 of I's to 1's
+
+@punct=('.','!',',');
+
+s/\. /. /g;
+s/\./$punct[int(rand 3)]/eg;
+s/\,/./g;
+
+
+# b1ff can't hold down on shift too well!!!!!!!1!
+sub make_exclimation {
+ my $length=shift || int(rand 5);
+ my $ret='!';
+ my $last=0;
+ for (1..$length) {
+ if (! $last && int(rand 3) eq 2) {
+ $ret.="1";
+ $last=1;
+ }
+ else {
+ $ret.="!";
+ $last=0;
+ }
+ }
+ return $ret;
+}
+
+# ask questions excitedly?!?!?!?!
+sub make_question {
+ my $length=shift || int(rand 5) + 1;
+ my $ret='';
+ my $last=0;
+ while (length($ret) < $length) {
+ if (! $last && int(rand 5) > 2) {
+ $ret.="?!";
+ $last=1;
+ }
+ elsif (! $last && int(rand 5) > 3) {
+ $ret.="?1";
+ $last=1;
+ }
+ else {
+ $ret.="?";
+ $last=0;
+ }
+ }
+ return $ret;
+}
--- /dev/null
+#!/usr/bin/perl
+# Censor filter.
+# Copyright 2002 by Joey Hess under the terms of the GNU GPL.
+
+# Yes, this program is self-modifying code, if you want it to be.
+if (exists $ENV{ADD_WORD}) {
+ open(IN, $0) || die "cannot read myself";
+ @lines=<IN>;
+ close IN;
+ open OUT, ">$0" || die "cannot write myself";
+ for (@lines) {
+ print OUT $_;
+ if (/^__DATA__\n$/) {
+ open(DATAOUT, "|sort|uniq|column >> $0");
+ $ENV{ADD_WORD} =~ y/n-za-m/a-z/;
+ print DATAOUT "$ENV{ADD_WORD}\n";
+ print DATAOUT join("\n",
+ map { chomp; split ' ', $_ } <DATA>);
+ close DATAOUT;
+ exit;
+ }
+ }
+}
+
+$censored = join("|", reverse sort { $a cmp $b }
+ grep { length $_ }
+ map { chomp; y/a-z/n-za-m/; split ' ', $_ } <DATA>);
+
+while (<>) {
+ s/\b($censored)ed/CENSORED/ig; # don't say "CENSOREDed"
+ s/\b($censored)/CENSORED/ig;
+ print $_;
+}
+
+__DATA__
+ahqr enaql gjng pbpx t-fcbg
+anxrq encr grng pbzrvat t\f+fcbg
+avccyr erne guebng pbzvat tebva
+bcravat fangpu gvg pebgpu ubbgre
+beny fchax gvggl penc ubeal
+betl fcrez gvggvr penpx ubyr
+betnfz fcuvapgre hgrehf pernz uhzc
+certanag fghq ihyin phag unaqwbo
+cevpx fgnss intvan phz urnq
+chff fhpx ivetva phzzvat wvfz
+chffl fjnyybj ivoengbe pnzr xabo
+chffvrf fperj jbzo preivk xvff
+chovp frk jrg pureel ybir
+chqraqhz frkhny juber pyvg ybire
+chzc frrq kkk pyvgbevf ybirq
+cnagvrf frzra nany pyvggl ybnq
+crargengr funsg nerbyn pyvznk ynovn
+crargengrq funt nff qevyyrq ynvq
+cravf funttvat nffubyr qrsybjre yrfovna
+crgre fuvg obbo qvpx yvcf
+crpxre fvrt\furvy oernfg qvyqb znfgheong
+cunyyhf fyhg ohgg rebgvp znfgheongr
+cvff fyhggvfu ohggbpx rerpgvba znfgheongvat
+ebfrohq fyvg onyy rkcbfrq znzznel
+ebq gbathr ovgpu shpx znzznevrf
+ehg gbby oybj snpvny
--- /dev/null
+#!/usr/bin/perl -p
+# Swedish Chef filter. Bork Bork Bork!
+# Copyright 1999 by Joey Hess under the terms of the GNU GPL.
+
+# Note that the order of the commands in this program is very important!
+
+# Change 'e' at the end of a word to 'e-a', but don't mess with the word
+# "the".
+s{(\w+)e(\b)}{
+ if (lc($1) ne 'th') {
+ "$1e-a$2"
+ }
+ else {
+ "$1e$2"
+ }
+}eg;
+
+# Stuff that happens at the end of a word.
+s/en(\b)/ee$1/g;
+s/th(\b)/t$1/g;
+
+# Stuff that happens if not the first letter of a word.
+s/(\w)f/$1ff/g;
+
+# Change 'o' to 'u' and at the same time, change 'u' to 'oo'. But only
+# if it's not the first letter of the word.
+tr/ou/uo/;
+s{(\b)([uo])}{
+ $1 . $2 eq 'o' ? 'u' : 'o'
+}eg;
+# Note that this also handles doubling "oo" at the beginning of words.
+s/o/oo/g;
+# Have to double "Oo" seperatly.
+s/(\b)O(\w)/$1Oo$2/g;
+# Fix the word "bork", which will have been mangled to "burk"
+# by above commands. Note that any occurence of "burk" in the input
+# gets changed to "boork", so it's completly safe to do this:
+s/\b([Bb])urk\b/$1ork/g;
+
+# Stuff to do to letters that are the first letter of any word.
+s/\be/i/g;
+s/\bE/I/g;
+
+# Stuff that always happens.
+s/tiun/shun/g; # this actually has the effect of changing "tion" to "shun".
+s/the/zee/g;
+s/The/Zee/g;
+tr/vVwW/fFvV/;
+
+# Stuff to do to letters that are not the last letter of a word.
+s/a(?!\b)/e/g;
+s/A(?!\b)/E/g;
+
+s/en/un/g; # this actually has the effect of changing "an" to "un".
+s/En/Un/g; # this actually has the effect of changing "An" to "Un".
+s/eoo/oo/g; # this actually has the effect of changing "au" to "oo".
+s/Eoo/Oo/g; # this actually has the effect of changing "Au" to "Oo".
+
+# Change "ow" to "oo".
+s/uv/oo/g;
+
+# Change 'i' to 'ee', but not at the beginning of a word,
+# and only affect the first 'i' in each word.
+s/(\b\w[a-hj-zA-HJ-Z]*)i/$1ee/g;
+
+# Special punctuation of the end of sentances but only at end of lines.
+s/([.?!])$/$1\nBork Bork Bork!/g;
--- /dev/null
+%{
+/*
+ * Lex filter to transform plain English into Cockney English.
+ * No racial or societal slurs are intended. For amusement only.
+ *
+ * Copyright 1986 by Daniel Klein.
+ *
+ * Reproduction permitted so long as this notice is retained.
+ */
+%}
+
+BW [ \t\n]
+SP [ \t]+
+EW [ \t.,;!\?$]
+
+%Start junk
+
+%%
+
+%{
+ void eos() {
+ if (yytext[yyleng-1] == '.')
+ dintI();
+ else
+ unput(yytext[yyleng-1]);
+ }
+
+ void plastc() {
+ unput(yytext[yyleng-1]);
+ }
+%}
+
+<junk>. { srandom(time(0L)); unput(yytext[0]); BEGIN 0; }
+{BW}[Tt]he{EW} { ECHO; bloody(); }
+{BW}[Ss]teal{EW} { printf("%c%cick",yytext[0],yytext[1]-5);
+ eos();
+ }
+{BW}[Ss]tole{EW} { printf("%c%cicked",yytext[0],yytext[1]-5);
+ eos();
+ }
+{BW}tired pooped();
+{BW}were{EW} |
+{BW}was{EW} { printf("%cwuz",yytext[0]); eos(); }
+[Hh]ello printf("'%cllo", caseify('u'));
+{BW}[Hh] printf("%c'",yytext[0]);
+{BW}[Yy]our{EW} { printf("%.2ser",yytext); eos(); }
+{BW}it{EW} { printf("%.2s'",yytext); eos(); }
+{BW}go{EW} { printf("%.2sow",yytext); eos(); }
+{BW}and{EW} { printf("%c'n'",yytext[0]); eos(); }
+{BW}my{EW} { printf("%.2se",yytext); eos(); }
+{BW}th(is|at){EW} { printf("%.5s", yytext); eos(); }
+{BW}[Ww]e{SP}went{EW} |
+{BW}[Ww]e{SP}had{EW} |
+{BW}[Ww]e{SP}did{EW} { printf("%.*s",yyleng-1,yytext);
+ set_did(2);
+ eos();
+ }
+{BW}I{SP}went{EW} |
+{BW}I{SP}had{EW} |
+{BW}I{SP}did{EW} { I();
+ printf(" did");
+ set_did(1);
+ eos();
+ }
+{BW}I{EW} { I(); eos(); }
+
+[Yy]ou{SP}[^aeiouy] { printf("%c'", yytext[0]); plastc(); }
+[Ww]hat{SP}are{EW} { printf("%cotta", yytext[0]); eos(); }
+
+{BW}other |
+[MmNnRr]other printf("%cuvver",yytext[0]);
+[MmSs]outh printf("%cowf", yytext[0]);
+[cYy]outh printf("%coof", yytext[0]);
+[^o]uth printf("%.2sf",yytext);
+{BW}th[^e] |
+[AaEeIiOo]th[^em] { printf("%cf",yytext[0]); plastc(); }
+oothe |
+e[ei]the { printf("%c%cve", yytext[0], yytext[0]); }
+ooth |
+eeth { printf("%c%cf", yytext[0], yytext[0]); }
+[aei]the { printf("%cvv",yytext[0]); plastc(); }
+th putchar('v');
+a[km]e{EW} { printf("i%ce",yytext[1]); eos(); }
+[^r][Oo]ld printf("%.2swld",yytext);
+[^AaEeIiOoUu][uo]nd[a-z] printf("%cunn%c",yytext[0],yytext[yyleng-1]);
+ing{EW} { printf("in'"); eos(); }
+[^dg]get+[^h] printf("%cge'%c",yytext[0],yytext[yyleng-1]);
+ail printf("aiw");
+any printf("enny");
+[rSs]ay{EW} { printf("%cigh",yytext[0]); eos(); }
+way printf("why");
+[BbHh]it{EW} { printf("%ci'",yytext[0]); eos(); }
+ait{EW} { printf("ite"); eos(); }
+ime{EW} { printf("oime"); eos(); }
+[^e]ize[^n] printf("%coize%c",yytext[0],yytext[yyleng-1]);
+[^e]ight printf("%coit",*yytext);
+[a-z]"?" { *(yytext+1) = ',';
+ printf("%s roit?",yytext);
+ clear_did();
+ }
+[a-z]"." { printf("%c", yytext[0]); dintI(); }
+\n printf("\n");
+
+%%
+
+caseify(c)
+char c;
+{
+ if (yytext[0] <= 'Z')
+ return (c - ' ');
+ else
+ return (c);
+}
+
+
+I()
+{
+/* extern long random(); */
+
+ if (random() % 100 < 20)
+ printf("%cOy",yytext[0]);
+ else
+ printf("%cI",yytext[0]);
+}
+
+static short b_count = 0;
+static short b_which = 0;
+
+bloody()
+{
+ if (b_count++ % 2 == 0) {
+ switch (b_which++ % 4) {
+ case 0: printf("bloody "); break;
+ case 1: printf("flinkin' "); break;
+ case 2: printf("bleedin' "); break;
+ case 3: printf("soddin' "); break;
+ }
+ }
+}
+
+static short did = 0;
+
+set_did(val)
+{
+ did = val;
+}
+
+clear_did()
+{
+ did = 0;
+}
+
+dintI()
+{
+/* extern long random(); */
+
+ if ((did == 1) && (random() % 100 < 50))
+ printf(", didn'I?");
+ else if ((did == 2) && (random() % 100 < 50))
+ printf(", din't we?");
+ else
+ printf(".");
+ clear_did();
+}
+
+pooped()
+{
+/* extern long random(); */
+
+ switch (random() % 3) {
+ case 0:
+ printf("%cknackered", yytext[0]);
+ break;
+ case 1:
+ printf("%cshagged out", yytext[0]);
+ break;
+ case 2:
+ printf("%cdone in", yytext[0]);
+ break;
+ }
+}
+
+expletive()
+{
+/*
+Blimey
+Stright a light
+'Strewth
+Cor blimey
+*/
+}
--- /dev/null
+* continue to make the chef filter more similar to the old one
+* write and collect more filters
+* does anyone have an asci-art cow font?
+* rms filter, though vrms already does a good job..
--- /dev/null
+filters (2.49) unstable; urgency=low
+
+ * scottish: Fix typo. Closes: #688905
+ * lolcat: New filter.
+
+ -- Joey Hess <joeyh@debian.org> Sat, 04 May 2013 23:48:11 -0400
+
+filters (2.48) unstable; urgency=low
+
+ * Mention that some filters support reading from input files.
+ Closes: #569764
+
+ -- Joey Hess <joeyh@debian.org> Sun, 06 Feb 2011 00:01:44 -0400
+
+filters (2.47) unstable; urgency=low
+
+ * Patch from Anssi Hannula to avoid warnings when
+ compiling with -Werror=format-security.
+ * scramble: New filter that scambles the inner letters of
+ words. Contributed by Andrew J. Buehler.
+ * Converted debian/copyright to machine parseable format.
+
+ -- Joey Hess <joeyh@debian.org> Sat, 11 Jul 2009 16:47:23 -0400
+
+filters (2.46) unstable; urgency=low
+
+ * fanboy: Improve docs and remove from SAMPLES. Closes: #496588
+
+ -- Joey Hess <joeyh@debian.org> Sun, 26 Oct 2008 23:44:04 -0400
+
+filters (2.45) unstable; urgency=low
+
+ * Use debhelper v7; rules file minimisation to 3 lines.
+
+ -- Joey Hess <joeyh@debian.org> Tue, 22 Jul 2008 00:25:48 -0400
+
+filters (2.44) unstable; urgency=low
+
+ * Work around dpkg bug #476138. Closes: #475979
+ * Use CC consistently.
+
+ -- Joey Hess <joeyh@debian.org> Mon, 14 Apr 2008 13:26:53 -0400
+
+filters (2.43) unstable; urgency=low
+
+ * Added the fanboy filter.
+
+ -- Joey Hess <joeyh@debian.org> Thu, 25 Oct 2007 04:58:44 -0400
+
+filters (2.42) unstable; urgency=low
+
+ * Moved from subversion to git.
+
+ -- Joey Hess <joeyh@debian.org> Fri, 19 Oct 2007 20:37:33 -0400
+
+filters (2.41) unstable; urgency=low
+
+ * pirate: Roll r's. Also, conjugate 'is' in present tense, and add some
+ more phrases. Closes: #443213
+
+ -- Joey Hess <joeyh@debian.org> Wed, 19 Sep 2007 14:26:41 -0400
+
+filters (2.40) unstable; urgency=low
+
+ * Update url to web page in README.
+ * Add scottish filter by Adam Borowski. Closes: #436168
+
+ -- Joey Hess <joeyh@debian.org> Thu, 09 Aug 2007 17:19:14 -0700
+
+filters (2.39) unstable; urgency=low
+
+ * Add kenny filter. Closes: #317656
+
+ -- Joey Hess <joeyh@debian.org> Mon, 20 Feb 2006 16:27:25 -0500
+
+filters (2.38) unstable; urgency=low
+
+ * Munged accented characters in man page.
+
+ -- Joey Hess <joeyh@debian.org> Sun, 18 Dec 2005 17:31:38 -0500
+
+filters (2.37) unstable; urgency=low
+
+ * Suggest bsdgames, which contains pig and rot13.
+
+ -- Joey Hess <joeyh@debian.org> Wed, 7 Sep 2005 23:36:38 -0400
+
+filters (2.36) unstable; urgency=low
+
+ * Impress all yer maties on talk like a pirate day with th' new priate
+ filter, by Dougal Campbell, to be sure.
+ * Retroactively spiced up th' changelog. Shiver me timbers!
+
+ -- Joey Hess <joeyh@debian.org> Thu, 25 Aug 2005 23:28:25 -0400
+
+filters (2.35) unstable; urgency=low
+
+ * Ad| nethackify filtcr. Closes: #317656
+ * Add automatic webpage update gunk.
+
+ -- Joey Hess <joeyh@debian.org> Thu, 25 Aug 2005 22:24:29 -0400
+
+filters (2.34) unstable; urgency=low
+
+ * Add uniencode filter. Because υɳіϲоⅾе is fun.
+ * Fix filters man page to escape hyphens. Because υɳіϲоⅾе is fun.
+
+ -- Joey Hess <joeyh@debian.org> Sat, 6 Nov 2004 13:37:51 -0500
+
+filters (2.33) unstable; urgency=low
+
+ * Better flex fixups; make sure to link with -lfl even if building
+ indivitually, and move stuff that uses unput into %{ %} delimited blocks
+ in rules section.
+
+ -- Joey Hess <joeyh@debian.org> Tue, 15 Apr 2003 15:06:25 -0400
+
+filters (2.32) unstable; urgency=low
+
+ * Deal with the new flex 2.5.31 as follows:
+ - Add main and yywrap functions, though they were not needed before.
+ - Call yyunput instead of unput macro, as the macro uses yytext_ptr,
+ which flex undefes before the bottom set of functions are defined.
+ Closes: #189040
+ * Various other fixes to build without warnings.
+
+ -- Joey Hess <joeyh@debian.org> Mon, 14 Apr 2003 23:39:26 -0400
+
+filters (2.31) unstable; urgency=low
+
+ * censor: corrected spelling of pyvgbevf, Closes: #172976
+
+ -- Joey Hess <joeyh@debian.org> Sat, 22 Feb 2003 14:03:18 -0500
+
+filters (2.30) unstable; urgency=low
+
+ * Falk Hueffner provided a patch to make kraut work on alpha.
+ Closes: #169256
+
+ -- Joey Hess <joeyh@debian.org> Thu, 21 Nov 2002 00:16:40 -0500
+
+filters (2.29) unstable; urgency=low
+
+ * Added certain German phrase to the censor filter. If Germans want to send
+ me censored German phrases, I will be glad to continue adding them to this
+ filter.
+
+ -- Joey Hess <joeyh@debian.org> Fri, 15 Nov 2002 13:35:51 -0500
+
+filters (2.28) unstable; urgency=low
+
+ * Fixed a typo in kraut.
+ * Note in man page that it's a _bad_ German accent. Think 1940's
+ American propiganda movies. Closes: #169163
+
+ -- Joey Hess <joeyh@debian.org> Fri, 15 Nov 2002 11:52:48 -0500
+
+filters (2.27) unstable; urgency=low
+
+ * Added a censor filter.
+ * Added a spammer filter which generates spamassassin-triggering
+ pseudo-spam from input.
+ * Updated eleet filter (which should perhaps be renamed to just 'leet')
+ to the <ahem> standards of irc circa mid 2002.
+ * Make jibberish filter only run text through 3 to 8 of the other filters.
+ * Various improvements.
+
+ -- Joey Hess <joeyh@debian.org> Sun, 3 Nov 2002 16:37:12 -0500
+
+filters (2.26) unstable; urgency=low
+
+ * Don't use dh_installmanpages.
+
+ -- Joey Hess <joeyh@debian.org> Thu, 13 Jun 2002 18:27:53 -0400
+
+filters (2.25) unstable; urgency=low
+
+ * Fixed debhelper build-dep.
+
+ -- Joey Hess <joeyh@debian.org> Sat, 1 Jun 2002 22:41:07 -0400
+
+filters (2.24) unstable; urgency=low
+
+ * debhelper v4
+ * DEB_BUILD_OPTS support
+
+ -- Joey Hess <joeyh@debian.org> Sat, 1 Jun 2002 16:45:49 -0400
+
+filters (2.23) unstable; urgency=low
+
+ * Patch from Seneca <seneca-cunningham@rogers.com> to correct newspeak's
+ handling of double quotes preeceeded by punctuation and followed by a
+ blank line. Closes: #146769
+
+ -- Joey Hess <joeyh@debian.org> Sun, 19 May 2002 19:52:06 -0400
+
+filters (2.22) unstable; urgency=low
+
+ * Something I already fixed in CVS, Closes: #124617
+ * debhelper v3.
+
+ -- Joey Hess <joeyh@debian.org> Mon, 17 Dec 2001 22:20:35 -0500
+
+filters (2.21) unstable; urgency=low
+
+ * Wrote elmer fudd filter in perl, replacment for a long-removed
+ lex filter of uncertian authorship and copyright. Closes: #109157
+
+ -- Joey Hess <joeyh@debian.org> Thu, 4 Oct 2001 19:32:00 -0400
+
+filters (2.20) unstable; urgency=low
+
+ * Woo hoo! JWZ has placed newspeak under a BSD-ish license, so it moves
+ in from filters-nonfree. Which is now empty, and will be removed.
+ * AdDed StudLy cAps FiltEr bY NiCk PHillIps <nwp@lemon-computing.com>.
+
+ -- Joey Hess <joeyh@debian.org> Mon, 6 Aug 2001 20:38:49 -0400
+
+filters (2.19) unstable; urgency=low
+
+ * Fixed jibberish makesamples run to not use installed versions of the
+ filters.
+
+ -- Joey Hess <joeyh@debian.org> Sat, 14 Jul 2001 23:44:45 -0400
+
+filters (2.18) unstable; urgency=low
+
+ * ky00te is free! That leaves only newspeak in filters-nonfree.
+ * A big thanks to Edward Betts for contacting authors.
+ * Fixed echo -n bashism in SAMPLES construction.
+ * rasterman: Added flim!
+
+ -- Joey Hess <joeyh@debian.org> Sat, 30 Jun 2001 18:51:39 -0400
+
+filters (2.17) unstable; urgency=low
+
+ * ken: WAP fixes.
+
+ -- Joey Hess <joeyh@debian.org> Mon, 11 Jun 2001 16:35:38 -0400
+
+filters (2.16) unstable; urgency=low
+
+ * ken is now free.
+
+ -- Joey Hess <joeyh@debian.org> Mon, 11 Jun 2001 14:58:58 -0400
+
+filters (2.15) unstable; urgency=low
+
+ * Rasterized jubberish, Closes: #81901
+
+ -- Joey Hess <joeyh@debian.org> Wed, 10 Jan 2001 23:48:00 -0800
+
+filters (2.14) unstable; urgency=low
+
+ * hahaha. addde a rasterman filter. (nto just "raster" as i woryr about
+ namespaec pollution.)
+
+ -- Joey Hess <joeyh@debian.org> Mon, 27 Nov 2000 20:00:28 -0800
+
+filters (2.13) unstable; urgency=low
+
+ * cockney, jive, and nyc filters are now GPL'd, moved from -nonfree
+ package.
+
+ -- Joey Hess <joeyh@debian.org> Wed, 22 Nov 2000 19:04:08 -0800
+
+filters (2.12) unstable; urgency=low
+
+ * Use debhelper v2.
+
+ -- Joey Hess <joeyh@debian.org> Mon, 25 Sep 2000 15:06:11 -0700
+
+filters (2.11) unstable; urgency=low
+
+ * Corrected the man page, which was misrepresenting me as the author of
+ some programs I didn't write.
+
+ -- Joey Hess <joeyh@debian.org> Tue, 29 Aug 2000 22:58:02 -0700
+
+filters (2.10) unstable; urgency=low
+
+ * upside-down: 5 and 2 are the best available upside-down versions of
+ themselves. I had it backwards.
+
+ -- Joey Hess <joeyh@debian.org> Thu, 29 Jun 2000 16:23:59 -0700
+
+filters (2.9) unstable; urgency=low
+
+ * Fixed "burk" to "bork" globally. Closes: #52589
+
+ -- Joey Hess <joeyh@debian.org> Sun, 12 Dec 1999 14:14:41 -0800
+
+filters (2.8) unstable; urgency=low
+
+ * makesample.sh is now careful to make sure each program is executable
+ before running it. Closes: #50985
+ * I also set -e the script.
+
+ -- Joey Hess <joeyh@debian.org> Mon, 22 Nov 1999 14:09:43 -0800
+
+filters (2.7) unstable; urgency=low
+
+ * A much better synopsis.
+
+ -- Joey Hess <joeyh@debian.org> Tue, 9 Nov 1999 00:06:57 -0800
+
+filters (2.6) unstable; urgency=low
+
+ * FHS
+
+ -- Joey Hess <joeyh@debian.org> Fri, 10 Sep 1999 21:25:47 -0700
+
+filters (2.5) unstable; urgency=low
+
+ * eleet: w -> \/\/
+ * Spelling correction patch from Edward Betts <edward@debian.org>
+ (closes: #38850)
+
+ -- Joey Hess <joeyh@debian.org> Thu, 3 Jun 1999 13:03:02 -0700
+
+filters (2.4) unstable; urgency=low
+
+ * chef: say "knooeeng" for "knowing", and in general say "oo" for "ow".
+
+ -- Joey Hess <joeyh@debian.org> Wed, 19 May 1999 17:20:07 -0700
+
+filters (2.3) unstable; urgency=low
+
+ * Added kraut filter (free version found).
+
+ -- Joey Hess <joeyh@debian.org> Wed, 17 Mar 1999 15:52:05 -0800
+
+filters (2.2) unstable; urgency=low
+
+ * fixed Makefile to add . to PATH before running makesample.sh, because it
+ called jibberish, which looks only in /usr/games for the filters, and if
+ you're building filters w/o the package installed, they won't be there
+ and the build will fail. Whew! (closes: #33758)
+
+ -- Joey Hess <joeyh@debian.org> Fri, 26 Feb 1999 00:17:24 -0800
+
+filters (2.1) unstable; urgency=low
+
+ 'umop ap!sdn fxaf sujnf `77am y)!ym `jaf7!j umop ap!sdn pappe *
+
+ -- Joey Hess <joeyh@debian.org> Sat, 20 Feb 1999 18:22:43 -0800
+
+filters (2.0) unstable; urgency=low
+
+ * Re-wrote the eleet, chef, b1ff filters in perl, dropped all the rest
+ (except jethro); they will be in filters-nonfree now. This was done
+ due to copyright problems in the original filters.
+ * Fixes important bug #32333
+
+ -- Joey Hess <joeyh@debian.org> Sun, 24 Jan 1999 13:13:17 -0800
+
+filters (1.8) unstable; urgency=low
+
+ * Added jibberish meta-filter by Raul Miller <rdm@test.legislate.com>.
+ (#24677)
+
+ -- Joey Hess <joeyh@debian.org> Fri, 4 Dec 1998 15:18:09 -0800
+
+filters (1.7) unstable; urgency=low
+
+ * Renamed mb to marc-barrett to eliminate namespace pollution.
+
+ -- Joey Hess <joeyh@debian.org> Wed, 15 Apr 1998 00:23:38 -0700
+
+filters (1.6) unstable; urgency=low
+
+ * 4dd3d 3l33t f1lt3r, th4nk5 t0 j3r3my w0rr3ll5 <jworrell@priacc.com>.
+
+ -- Joey Hess <joeyh@debian.org> Fri, 6 Mar 1998 11:41:29 -0800
+
+filters (1.5) unstable; urgency=low
+
+ * Updated standards-version.
+
+ -- Joey Hess <joeyh@debian.org> Mon, 9 Feb 1998 13:38:55 -0800
+
+filters (1.4) unstable; urgency=low
+
+ * Use debhelper.
+
+ -- Joey Hess <joeyh@debian.org> Sat, 7 Feb 1998 19:38:35 -0800
+
+filters (1.3) unstable; urgency=low
+
+ * Libc6.
+ * Added man pages. #11318
+
+ -- Joey Hess <joeyh@debian.org> Wed, 16 Jul 1997 13:31:07 -0400
+
+filters (1.2) frozen unstable; urgency=low
+
+ * Fixed bug #8329 (buck segfaulted if it encountered C[aou] or R[aeiou] in
+ input.)
+ * Routine update of debian/rules:
+ Run dpkg-gencontrol after debstd, and delete substvars during clean.
+
+ -- Joey Hess <joeyh@debian.org> Tue, 8 Apr 1997 20:59:12 -0400
+
+filters (1.1) unstable; urgency=low
+
+ * Changed version number to 1.1, because there was some confusion if this
+ was a debian-only package. It is, so I've removed the debian revision
+ number.
+
+ -- Joey Hess <joeyh@debian.org> Tue, 24 Dec 1996 20:35:51 -0500
+
+filters (1.0-2) unstable; urgency=low
+
+ * New email address.
+ * Use debmake.
+
+ -- Joey Hess <joeyh@debian.org> Tue, 24 Dec 1996 15:40:55 -0500
+
+filters (1.0-1) unstable; urgency=low
+
+ * First release.
+
+ -- Joey Hess <joeyh@debian.org> Sat, 28 Sep 1996 00:55:40 -0400
--- /dev/null
+Source: filters
+Section: games
+Priority: optional
+Build-Depends: debhelper (>= 7), flex, bison | byacc | btyacc, dpkg-dev (>= 1.9.0)
+Maintainer: Joey Hess <joeyh@debian.org>
+Standards-Version: 3.9.1
+Vcs-Git: git://git.kitenet.net/filters
+Homepage: http://kitenet.net/~joey/code/filters/
+
+Package: filters
+Architecture: any
+Conflicts: filters-nonfree
+Replaces: filters-nonfree
+Suggests: bsdgames
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: a collection of filters, including B1FF and the Swedish Chef
+ A collection of filters to do all sorts of strange things to text.
+ This includes such favorites as B1FF and the Swedish Chef, and a wide
+ range of others.
--- /dev/null
+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Source: Gathered from many sources, including old usenet posts in the 90's.
+
+Files: *
+Copyright: 1996-2009 Joey Hess <joey@kitenet.net>
+License: GPL-2+
+ The full text of the GPL is distributed as GPL in filters's source,
+ and is distributed in /usr/share/common-licenses/GPL-2 on Debian systems.
+
+Files: jethro.l
+Copyright: 1993 Duane Paulson <ci922@cleveland.freenet.edu>
+License: other
+ ** Public domain. Use at your own risk. Y'all come back now, heah?
+
+Files: kraut.dir/*
+Copyright: 1989 John Sparks
+License: other
+ /* This is in the public domain. Do with it as you will. *\
+
+Files: cockney.l jive.l nyc.l
+Copyright: 1986 Daniel V Klein <dvk@lonewolf.com>
+License: GPL
+ Daniel confirmed the copyright in this email:
+ .
+ From: Daniel V Klein <dvk@lonewolf.com>
+ Date: Wed, 22 Nov 2000 22:00:50 -0500
+ To: Joey Hess <joey@kitenet.net>
+ Subject: Re: filters GPL'd
+ .
+ That is so. Have fun (FWIW, I have done some rewriting on them - they are
+ now in Perl, but still need some work...)
+ .
+ -Dan
+ .
+ > I've been told that you have changed the copyright of the cockney, jive
+ > and nyc filters to the GPL? Is that correct? I'd love to move them into
+ > Debian proper.
+
+Files: rasterman
+Copyright: 1997 Zachary Beane
+License: GPL-2
+
+Files: ken.l
+Copyright: Stephen K Mulrine <smulrine%cs.strath.ac.uk@nsfnet-relay.ac.uk>
+License: other
+ The ken filter is now in the public domain. Its author confirmed the
+ new license in this email:
+ .
+ From: Stephen Mulrine <stephen@moroder.scotnet.co.uk>
+ Date: Mon, 11 Jun 2001 01:06:52 +0100 (BST)
+ To: edward@debian.org (Edward Betts)
+ Subject: Re: Ken?
+ .
+ [...]
+ .
+ >We would like to include ken in the Debian GNU/Linux Operating System, but
+ >we need permission to modify ken if we want to. Would you be willing to
+ >relicense ken under the GNU GPL, a BSD like license, or public domain?
+ .
+ Certainly, it would be an honour to have it included in the Debian
+ distribution so I hereby release ken into the public domain.
+
+Files: ky00te.dir/*
+Copyright: 1994 Brent E. Edwards
+License: GPL-2
+ The ky00te filter is now relicensed under the GPL. Its author
+ confirmed the new license in this email:
+ .
+ From: Brent Edwards <chipuni@hypersurf.com>
+ Date: Sat, 30 Jun 2001 09:37:53 -0700
+ To: Edward Betts <edward@debian.org>
+ Subject: Re: Is this the author of the ky00te filter?
+ .
+ Dear Edward,
+ You have my permission to put the ky00te filter into the GNU GPL
+ license. (Though the license will be far longer than the program itself!)
+ .
+ -- Brent Edwards
+
+Files: newspeak.l
+Copyright: 1991 Jamie Zawinski <jwz@jwz.org>
+License: other
+ The newspeak filter is now relicensed under a BSD-like copyright. Its
+ author established the new copyright in this email:
+ .
+ From: Jamie Zawinski <jwz@jwz.org>
+ Date: Mon, 06 Aug 2001 16:17:02 -0700
+ To: Joey Hess <joeyh@debian.org>
+ Subject: Re: copyright of newspeak filter
+ .
+ Hey there -- I'm cleaning out old mail, and don't remember if I replied
+ to this or not. Anyway, in case I didn't -- feel free to slap this
+ license atop the newspeak script (it's BSD-like, so that should work
+ for you.)
+ .
+ Copyright (c) 1991 Jamie Zawinski <jwz@jwz.org>
+ .
+ Permission to use, copy, modify, distribute, and sell this
+ software and its documentation for any purpose is hereby granted
+ without fee, provided that the above copyright notice appear in
+ all copies and that both that copyright notice and this
+ permission notice appear in supporting documentation. No
+ representations are made about the suitability of this software
+ for any purpose. It is provided "as is" without express or
+ implied warranty.
+
+Files: studly
+Copyright: Nick Phillips <nwp@lemon-computing.com>
+License: other
+ # just for reference, you may do whatever you like with this file.
+
+Files: nethackify
+Copyright: 2004 G�kan Seng� <gurkan@linuks.mine.nu>
+License: GPL-2
+
+Files: pirate
+Copyright: 2003 Dougal Campbell
+License: GPL-2
+ Converted from a php version in the funfilters.
+
+Files: kenny
+Copyright:
+ 2001 Christian Garbs <mitch@cgarbs.de>
+ 2002 Alan Eldridge <alane@geeksrus.net>
+License: Artistic
+ On Debian systems, the full text of the Artistic license can be found in
+ /usr/share/common-licenses/Artistic
+
+Files: scottish
+Copyright: 2007 Adam Borowski <kilobyte@angband.pl>
+License: GPL-3+
+ The full text of the GPL version 3 can be found in
+ /usr/share/common-licenses/GPL-3 on Debian systems.
+
+License: GPL-2
+ The full text of the GPL is distributed as GPL in filters's source,
+ and is distributed in /usr/share/common-licenses/GPL-2 on Debian systems.
--- /dev/null
+README SAMPLES ky00te.dir/README.ky00te
--- /dev/null
+#!/usr/bin/make -f
+%:
+ dh $@
+
+# Not intended for use by anyone except the author.
+announcedir:
+ @echo ${HOME}/src/joeywiki/code/filters/news
--- /dev/null
+#!/usr/bin/perl -p
+# Eleet filter, Copyright 1999,2002 by Joey Hess under the terms of the GNU GPL.
+BEGIN {
+ # abcdefghijklmnopqrstuvwxyz
+ $transstring="4bcd3fgh1jklmn0pqr5tuvwxyz";
+ $t="tr/a-zA-Z/$transstring$transstring/";
+}
+s/porn/pr0n/g;
+s/elite/l33t/g;
+eval $t;
+
+# These are not in common usage anymore.
+#s:h:|-|:ig;
+#s:l:|_:ig;
+#s:m:/\\/\\:ig;
+#s:n:/\\/:ig;
+#s:w:\\/\\/:ig;
+#s:v:\\/:ig;
+#s:x:><:ig;
--- /dev/null
+#!/usr/bin/perl
+
+my %topics=(
+ git => [qw(linus git linux rebase rebased merge merged cherry-pick
+ branch branched branches git-* push pull pushed pulled)],
+ ubuntu => [qw(Mark MOTU PPA ubuntu debian rock rocks rule dapper
+ feisty fiesty gutsy hoary hardy edgy
+ universe launchpad gnome desktop naked sabdfl community)],
+ debian => [qw(Debian rules rule ian murdock upstream release
+ stable unstable testing apt apt-get deb developer NM RM
+ NMU FTBFS BTS ITP DFSG non-free free d.o)],
+);
+
+if (! @ARGV) {
+ @ARGV=@{$topics{git}};
+}
+elsif (@ARGV == 1 && exists $topics{lc $ARGV[0]}) {
+ @ARGV=@{$topics{lc $ARGV[0]}};
+}
+
+my $total_awesomeness_dude=join("|",
+ map {
+ $_=quotemeta($_);
+ s/\\\*/.*/g;
+ s/\\\?/./g;
+ qr/\b$_\b/;
+ } reverse sort @ARGV);
+
+my $len=0;
+my $indent="";
+my $indent_printed=0;
+while (<STDIN>) {
+ if (/$total_awesomeness_dude/i) {
+ if (/^([>|][>|\s]*)/) {
+ if ($indent ne $1) {
+ print "\n" if $len;
+ $len=0;
+ $indent=$1;
+ $indent_printed=0;
+ }
+ }
+ else {
+ if (length $indent && $indent_printed) {
+ print "\n";
+ $len=0;
+ }
+ $indent="";
+ $indent_printed=0;
+ }
+
+ while(/(($total_awesomeness_dude)[.?!]*)/ig) {
+ $len+=length($1)+1;
+ if ($len > 70) {
+ print "\n";
+ $len=0;
+ }
+ if (length $indent && ! $indent_printed) {
+ print $indent;
+ $indent_printed=1;
+ }
+ print $1." ";
+ }
+ }
+}
+print "\n" if $len;
--- /dev/null
+.TH FILTERS 6
+.SH NAME
+ken, b1ff, censor, chef, cockney, eleet, fanboy, fudd, jethro, jibberish, jive, kenny, kraut, ky00te, nethack, newspeak, nyc, pirate, rasterman, scottish, spammer, scramble, studly, uniencode, upside\-down \- assorted text filters
+.SH SYNOPSIS
+ $SHELL | chef
+
+ newspeak < thesis.tex > newthesis.tex
+
+ eleet | wall # b1ff works well too
+
+ b1ff | ircII | censor
+.SH "DESCRIPTION"
+All of these programs are filters to do all sorts of strange things to text.
+No personal, racial, religious or societal slurs are intended. For amusement
+only.
+.P
+All the filters read input from stdin, change it, and write the filtered
+text to stdout. Some filters also support reading from files and
+writing to stdout.
+.IP b1ff
+The B1FF filter
+.IP lolcat
+As seen in internet gifs everywhere.
+.IP cockney
+Cockney English
+.IP chef
+convert English on stdin to Mock Swedish on stdout
+.IP eleet
+K3wl hacker slang
+.IP fanboy
+Speak like a fanboy. Filters out extraneous words and focuses on the words
+fans use. By default, it will speak like a fan of git/Linus/linux
+development. To change this, pass as parameters the words that the fanboy
+typically uses. Alternatively, pass the name of a topic that typically has
+fanboys to use a predefined word list.
+.IP fudd
+Elmer Fudd
+.IP jethro
+Hillbilly text filter
+.IP jive
+Jive English
+.IP jibberish
+Runs text through a random selection of the rest of the filters, to make really
+weird output.
+.IP ken
+English into Cockney, featuring (dubious) rhyming
+slang for a lot of computer terminology.
+.IP kraut
+Generates text with a bad German accent.
+.IP kenny
+Generates text as spoken by Kenny on South Park.
+.IP ky00te
+This program places a very cute (and familiar to FurryMuck
+fans) accent on any text file.
+.IP nethackify
+Wiped out text like can be found in nethack.
+.IP newspeak
+A-la-1984
+.IP censor
+CDA-ize text
+.IP nyc
+Brooklyn English
+.IP pirate
+Talk like a pirate.
+.IP rasterman
+Makes text look like it came from the keyboard of Carsten Haitzler.
+.IP scottish
+Fake scottish (dwarven) accent filter, inspired by the character "Durkon"
+from Order of the Stick.
+.IP spammer
+Turns honest text into something that is liable to be flagged as spam.
+.IP scramble
+Scramble the "inner" letters of each word in the input into a random order.
+The resulting text is still strangely readable.
+.IP studly
+Studly caps.
+.IP uniencode
+Use glorious unicode to the fullest possibile extent. As seen previously in
+many man pages.
+.IP upside\-down
+Flips text upside down. Stand on your head and squint to read the output.
+.SH "SEE ALSO"
+.IP /usr/share/doc/filters/SAMPLES
+Lists samples of the output of all the filters.
+.PP
+Other filters:
+.TP
+.B pig
+From the bsdgames package, pig converts text to pig latin.
+.TP
+.B dog --oog
+From the dog package, dog can also function as a filter, converting text to
+OOG-speak.
+.SH AUTHORS
+The eleet, upside\-down, chef, b1ff, and censor filters were written by
+Joey Hess <joey@kitenet.net>. Daniel V Klein <dvk@lonewolf.com> wrote the
+cockney, jive, and nyc filters. jibberish is by Raul Miller
+<rdm@test.legislate.com>, jethro is by Duane Paulson
+<ci922@cleveland.freenet.edu>, rasterman is by Zachary Beane, ken is by
+Stephen K Mulrine <skm@eqsn.net>, newspeak is by Jamie Zawinski
+<jwz@jwz.org>, studly is by Nick Phillips <nwp@lemon\-computing.com>,
+Gurkan Sengun <gurkan@linuks.mine.nu> wrote nethackify, Dougal Campbell
+<dougal@gunters.org> wrote pirate, kraut is by John Sparks, scottish by
+Adam Borowski, Kenny is by Christian Garbs and Alan Eldridge,
+and scramble by Andrew J. Buehler.
--- /dev/null
+#!/usr/bin/perl -p
+# Elmer Fudd. GPL 2001 by Joey Hess <joey@kitenet.net>
+s/[rl]/w/g;
+s/qu/qw/g;
+s/th\b/f/g;
+s/th\B/d/g;
+s/n\./n, uh-hah-hah-hah. /g;
+s/[RL]/W/g;
+s/Qu/Qw/g;
+s/QU/QW/g;
+s/TH\b/F/g;
+s/TH\B/D/g;
+s/Th/D/g;
+s/N\./N, uh-hah-hah-hah./g;
--- /dev/null
+
+ /* jethro.l */
+%e 7000
+%k 5000
+%p 9000
+%n 2000
+%a 9000
+%o 7000
+
+SW [\n \"(]
+EW [\n ".",\"!?):;]
+BW [\n ]
+
+%{
+ /*
+ ** jethro v. 1.00 06/10/93
+ ** Duane Paulson <ci922@cleveland.freenet.edu> "dap"
+ ** Hillbilly text filter. Compile with lex, then C.
+ ** syntax will be:
+ ** jethro <input_file >output_file.
+ ** Public domain. Use at your own risk. Y'all come back now, heah?
+ */
+ /*************************************************************************
+ REVISION LOG
+ when ver who change
+ -------- ---- --- -----------------------------------------------------
+ 06/10/93 1.00 dap Initial release.
+ 8.May.94 1.10 beg Fixed for HP-UX
+ *************************************************************************/
+
+#define PUTLAST unput(*(yytext+strlen(yytext)-1));
+#define SUB(A) fprintf(yyout, "%c%s", *A|(*yytext&32), A+1);
+#define SSUB(A) fprintf(yyout, "%c%c%s", *yytext, *A|(*(yytext+1)&32), A+1);
+#define SESUB(A) fprintf(yyout, "%c%c%s", *yytext, *A|(*(yytext+1)&32), A+1); PUTLAST;
+#define ESUB(A) fprintf(yyout, "%c%s", *A|(*yytext&32), A+1); PUTLAST;
+
+#include <string.h>
+
+char WhAt[]="@(#)Duane Paulson's hillbilly text filter. (jethro)\n@(#)$Header: jethro.l,v 1.1 94/05/08 23:41:58 bgriffin Final $"
+;
+
+%}
+
+%%
+
+{SW}[Gg]reetings{EW} |
+{SW}[Hh]i{EW} |
+{SW}[Hh]ello{EW} SESUB("Howdy");
+{SW}[Bb]ye{EW} |
+{SW}[Gg]oodbye{EW} SESUB("Y'all come back now, heah?");
+{SW}[Hh]ear{EW} SESUB("Heah");
+{SW}[Cc]ar{EW} |
+{SW}[Aa]uto{EW} |
+{SW}[Rr]elax{EW} SESUB("Set a spell -- put yore feet up");
+{SW}[Aa]utomobile{EW} SESUB("Gasoline buggy");
+[Ss]wimming{BW}pool SUB("Cement pond");
+[Pp]ool{BW}table SUB("Fancy eatin table");
+[Pp]ool{BW}cue |
+[Cc]ue{BW}stick SUB("Fancy pot passer");
+{SW}[Bb][r]?oil{EW} |
+{SW}[Bb]ake{EW} |
+{SW}[Ff]ry{EW} |
+{SW}[Ss]aute{EW} |
+{SW}[Cc]ook{EW} SESUB("Whomp up");
+{SW}[Bb][r]?oiling{EW} |
+{SW}[Bb]akeing{EW} |
+{SW}[Ff]rying{EW} |
+{SW}[Ss]auteing{EW} |
+{SW}[Cc]ooking{EW} SESUB("Whompin up");
+{SW}[Bb][r]?oiled{EW} |
+{SW}[Bb]aked{EW} |
+{SW}[Ff]ryed{EW} |
+{SW}[Ss]auted{EW} |
+{SW}[Cc]ooked{EW} SESUB("Done whomped up");
+{SW}[Bb][r]?oils{EW} |
+{SW}[Bb]akes{EW} |
+{SW}[Ff]rys{EW} |
+{SW}[Ss]autes{EW} |
+{SW}[Cc]ooks{EW} SESUB("Whomps up");
+{SW}[Gg]roceries{EW} |
+{SW}[Ff]ood{EW} SESUB("Vittles");
+[Ss]alad SUB("Slaw");
+[Vv]egetable SUB("Green");
+[Pp]otato SUB("Tater");
+{SW}[Tt]omato SSUB("Tuhmater");
+{SW}[Rr]hubarb{EW} SESUB("Pie plant");
+{SW}[Ll]iquor{EW} |
+{SW}[Ww]hisk[e]?y{EW} |
+{SW}[Ss]cotch{EW} |
+{SW}[Bb]ourbon{EW} |
+{SW}[Gg]in{EW} |
+{SW}[Vv]odka{EW} |
+{SW}[Tt]equila{EW} |
+{SW}[Ll]iqueur{EW} SESUB("Rheumatiz medcin");
+{SW}[Bb]ooze{EW} SESUB("Corn likker");
+{SW}[Cc]ocktail{EW} |
+{SW}[Mm]ixed{BW}drink{EW} SESUB("Waste of good likker");
+{SW}[Bb]ar{EW} SESUB("Dance hall");
+{SW}[Bb]ars{EW} SESUB("Dance halls");
+{SW}[Ss]aloon |
+{SW}[Cc]ocktail{BW}lounge SESUB("Dance hall");
+{SW}[Ww]hore |
+{SW}[Pp]rostitute |
+{SW}[Ss]lut SSUB("Dance hall girl");
+{SW}[Ss]ecret{BW}agent{EW} |
+{SW}[Ss]py{EW} |
+{SW}007{EW} SESUB("Double nought spy");
+{SW}[Zz]ero{EW} SESUB("Nought");
+{SW}[Pp]ants{EW} SESUB("Trousers");
+{SW}[Jj]eans{EW} |
+{SW}[Dd]ungarees{EW} |
+{SW}[Ll]evi[']?s{EW} SESUB("Overhalls");
+{SW}[Ss]hoe SSUB("High-button shoe");
+{SW}[Jj]acket SSUB("Coat");
+{SW}[Ss]hotgun SSUB("Fowlin piece");
+{SW}[Rr]evolver |
+{SW}[Gg]un SSUB("Shootin iron");
+{SW}[Rr]ifle SSUB("Ozark longrifle");
+{SW}[Ll]ibrar[yi] SSUB("Liberry");
+[Ww]ash SUB("Warsh");
+[Ff]amily SUB("Fambly");
+[Ff]ry{BW}pan |
+[Ff]rying{BW}pan |
+[Ss]aute{BW}pan SUB("Skillet");
+{SW}[Aa]nimal SSUB("Critter");
+{SW}FBI{EW} |
+{SW}F.B.I.{EW} |
+{SW}CIA{EW} |
+{SW}C.I.A.{EW} |
+{SW}ATF{EW} |
+{SW}A.T.F.{EW} |
+{SW}IRS{EW} |
+{SW}I.R.S.{EW} |
+{SW}SS{EW} |
+{SW}S.S.{EW} |
+{SW}[Ss]elective{BW}[Ss]ervice{EW} |
+{SW}[Ss]elective{BW}[Ss]ervice{BW}[Ss]ystem{EW} |
+{SW}[Ss]ecret{BW}[Ss]ervice{EW} SESUB("Revanooers");
+{SW}[Pp]olice |
+{SW}[Pp]oliceman |
+{SW}[Ss]heriff |
+{SW}[Dd]eputy |
+{SW}[Dd]eputy{BW}[Ss]heriff |
+{SW}[Mm]arshall |
+{SW}[Dd]eputy{BW}[Mm]arshall |
+{SW}[Pp]ark{BW}[Rr]anger |
+{SW}[Tt]exas{BW}[Rr]anger |
+{SW}[Hh]ighway{BW}[Pp]atrol SSUB("Constable");
+
+{SW}[Mm]other |
+{SW}[Mm][ao]mm[ay]? |
+{SW}[Mm]ommie |
+{SW}[Mm]om SSUB("Maw");
+{SW}[Mm]a{EW} SESUB("Maw");
+{SW}[Ff]ather SSUB("Paw");
+{SW}[Dd]ad{EW} |
+{SW}[Dd]addy |
+{SW}[Pp]a{EW} |
+{SW}[Pp][ao]p{EW} |
+{SW}[Pp][ao]pp[ay]?{EW} SESUB("Paw");
+{SW}[Gg]randmother{EW} |
+{SW}[Gg]randma[w]?{EW} SESUB("Granny");
+{SW}[Gg]randfather{EW} |
+{SW}[Gg]ran[d]{1,2}ad[d]?[y]?{EW} |
+{SW}[Gg]randpop{EW} |
+{SW}[Gg]randpa[w]?{EW} SESUB("Grampy");
+{SW}[Mm]y{EW} SESUB("Mah");
+{SW}them{EW} SESUB("em");
+[Dd]og SUB("Dawg");
+[Ll]awyer |
+[Ll]egal{BW}counc[ei]l |
+[Ll]egal{BW}councellor |
+[Aa]ttorney |
+[Aa]ttorney{BW}[Aa]t{BW}[Ll]aw SUB("City slicker");
+
+{SW}[Tt]han{EW} SESUB("Then");
+[Cc]haracterize SUB("Show");
+{SW}[Vv]ery{EW} |
+{SW}[Ee]xtremely{EW} |
+{SW}[Rr]eally{EW} |
+{SW}[Rr]eal{EW} SESUB("Right");
+{SW}[Hh]aven't{EW} |
+{SW}[Ii]sn't{EW} |
+{SW}[Aa]ren't{EW} SESUB("Aint");
+{SW}[Ss]aid{EW} |
+{SW}[Ss]ays{EW} SESUB("Sez");
+{SW}[Aa]re{EW} SESUB("Is");
+{SW}[Ss]hould{EW} SESUB("Ortta");
+{SW}[Pp]erhaps{EW} |
+{SW}[Mm]aybe{EW} SESUB("Mebbe");
+{SW}[Ss]ick{EW} SESUB("Ailin'");
+{SW}I'm{BW}not{EW} SESUB("I aint");
+{SW}[Ss]cared{EW} SESUB("A-skeert");
+{SW}[Ss]care SSUB("Skeer");
+{SW}[Hh]ave{EW} SESUB("Got");
+{SW}[Pp]ossess{EW} SESUB("Have");
+{SW}[Hh]elp SSUB("Hep");
+{SW}[Tt]ired{EW} SESUB("Tuckered out");
+{SW}[Cc]ompletely{EW} SESUB("Plumb");
+{SW}[Dd]runk{EW} SESUB("A mite woozy");
+
+{SW}[Yy]es{EW} SESUB("Yep");
+{SW}[Nn]o{EW} SESUB("Nope");
+
+{SW}[Ii]t{BW}is{EW} SESUB("Tis");
+{SW}[Aa]t{BW}all{EW} *(yytext+1)=(char)'A'; SESUB("A tall");
+
+{SW}[Aa]m{EW} |
+{SW}[Ww]as{EW} |
+{SW}[Ww]ere{EW} SESUB("Wuz");
+{SW}[Ww]asn't{EW} SESUB("Wasunt");
+[Ee]very SUB("Ever");
+{SW}[Ww]ant/s SSUB("Is after");
+{SW}[Ww]anted{EW} SESUB("Was after");
+{SW}[Ww]anting{EW} SESUB("Hankering after");
+{SW}[Dd]oesn't{EW} |
+{SW}[Dd]on't{EW} SESUB("Dasent");
+{SW}[Yy]ou'll{EW} SESUB("Y'all will");
+{SW}[Yy]our SSUB("Yore");
+{SW}[Mm]ore{EW} SESUB("Mo");
+tial SUB("shul");
+cious SUB("shus");
+ious SUB("yus");
+tion SUB("shun");
+{SW}[Cc]an{EW} SESUB("C'n");
+{SW}[Yy]ou{EW} SESUB("Y'all");
+{SW}[Ff]or{EW} SESUB("Fer");
+{SW}[Tt]he{EW} SESUB("Duh");
+ing SUB("in");
+{SW}[Tt]oo{EW} SESUB("Besides");
+{SW}[Tt]o{EW} SESUB("Tuh");
+{SW}[Aa][n]?{EW} SESUB("Ah");
+{SW}[Oo]ur{EW} |
+{SW}[Oo]r{EW} SESUB("Ore");
+{SW}[Oo]f{EW} SESUB("Uv");
+{SW}I{EW} SESUB("Ah");
+{SW}I'm{EW} SESUB("Ahm a");
+{SW}I'll{EW} SESUB("Ahl");
+{SW}I'd{EW} SESUB("Ah wood");
+'nt *(yytext)=(char)'u'; SUB("unt");
+'re SUB(" is");
+'ve SUB(" done");
+eed{EW} ECHO;
+ed{EW} ESUB("d");
+{SW}[Oo]wn{EW} |
+{SW}[Tt]own{EW} |
+{SW}[Dd]own{EW} |
+{SW}[Gg]own{EW} |
+{SW}[Bb]rown{EW} ECHO;
+wn{EW} ESUB("ed");
+{SW}[Bb]elow{EW} |
+{SW}[Kk]now{EW} |
+{SW}[Tt]hrow{EW} |
+{SW}[Gg]row{EW} |
+{SW}[Hh]ow{EW} |
+{SW}[Nn]ow{EW} |
+{SW}[Bb]row{EW} |
+{SW}[Ss]how{EW} ECHO;
+ow{EW} ESUB("er");
+re{EW} |
+er{EW} ESUB("uh");
+{SW}[Hh]er{EW} ECHO;
+! SUB(". Ye DAWGies!!!");
+
+%%
--- /dev/null
+#!/usr/bin/perl
+# jibberish -- run filters in random order
+
+$ENV{PATH}.=":/usr/games";
+
+@all= qw(
+eleet
+b1ff
+chef
+jethro
+upside-down
+kraut
+cockney
+jive
+pirate
+nyc
+ken
+ky00te
+rasterman
+newspeak
+studly
+censor
+spammer
+);
+
+# shuffle order
+srand;
+for (0..$#all) {
+ my $n= @all*rand;
+ my $was= $all[$_];
+ $all[$_]= $all[$n];
+ $all[$n]= $was;
+}
+
+# start the pipe...
+my $pipe= join '|', @all[0..3 + rand(5)];
+open FILTER, "$pipe|"
+ or die "Never mind...\n";
+
+# display the results
+while (<FILTER>) {
+ print $_
+}
+
+# This could be optimized: take the last program off the pipeline,
+# open the pipeline as standard input, then exec that last program.
+#
+# But you have to ask yourself: how important is it to optimize
+# the generation of jibberish?
--- /dev/null
+%{
+/*
+ * Lex filter to transform plain English into Jive English.
+ * No racial or societal slurs are intended. For amusement only.
+ *
+ * Copyright 1986 by Daniel Klein and Clement Cole.
+ *
+ * Reproduction permitted so long as this notice is retained.
+ */
+
+%}
+%e 1700
+%p 4000
+%n 700
+%k 450
+%a 1700
+%o 1500
+BW [ \t\(]
+EW [ \t.,;!\?$\)]
+%%
+%{
+ void plastc()
+ {
+ unput(yytext[yyleng-1]);
+ }
+%}
+@[Bb]egin(.*) |
+".so ".*$ printf("%s", yytext);
+{BW}send printf("%ct'row",yytext[0]);
+program+ printf("honky code");
+[Uu]nix printf("slow mo-fo");
+UNIX printf("dat slow mo-fo");
+actual printf("ak'shul");
+{BW}take printf("%csnatch",yytext[0]);
+{BW}took |
+{BW}take[ns] printf("%csnatch'd",yytext[0]);
+[Mm]exican printf("%cet-back", caseify('w'));
+[Ii]talian printf("%creaser", caseify('g'));
+{BW}big{EW} { printf("%cbig ass",yytext[0]);plastc();}
+fool printf("honkyfool");
+modem printf("doodad");
+{BW}he{EW} { printf("%cmah' man he",yytext[0]);plastc();}
+"e the"{EW} |
+"a the"{EW} |
+"t the"{EW} |
+"d the"{EW} { printf("%c da damn", yytext[0]);plastc();}
+wife |
+woman printf("mama");
+girl printf("goat");
+something printf("sump'n");
+{BW}lie printf("%chonky jive",yytext[0]);
+-o- printf("-on rebound-");
+[a-z]"." { printf("%s", yytext);expletive();}
+! printf(". Right On!");
+[Ss]ure printf("%cho'", yytext[0]);
+get printf("git");
+"will have"{EW} |
+"will"{EW} |
+"got to"{EW} { printf("gots'ta");plastc();}
+"I am" printf("I's gots'ta be");
+"aren't" |
+"am not" |
+"have not" |
+"is not" |
+"are not" printf("ain't");
+{BW}see{EW} { printf("%csee's",yytext[0]);plastc();}
+{BW}are{EW} { printf("%cis",yytext[0]);plastc();}
+{BW}hat{EW} { printf("%cfedora",yytext[0]);plastc();}
+{BW}shoe printf("%ckicker",yytext[0]);
+{BW}"have to"{EW} |
+{BW}has{EW} { printf("%cgots'ta",yytext[0]);plastc();}
+have printf("gots'");
+{BW}go{EW} |
+{BW}"come over"{EW} |
+{BW}come{EW} { printf("%cmosey on down",yytext[0]);plastc();}
+buy printf("steal");
+{BW}car{EW} { printf("%cwheels",yytext[0]);plastc();}
+drive printf("roll");
+{BW}food printf("%ccatfish an' colluhd greens",yytext[0]);
+{BW}eat{EW} { printf("%cfeed da bud",yytext[0]);plastc();}
+drink printf("guzzle");
+black |
+negro printf("brother");
+white printf("honky");
+nigger printf("gentleman");
+nice printf("supa' fine");
+{BW}person printf("%csucka'",yytext[0]);
+[Pp]eople printf("%cucka's", caseify('s'));
+{BW}thing thing(yytext[0]);
+house{EW} { printf("crib");plastc();}
+home printf("plantation");
+name printf("dojigger");
+{BW}path printf("%calley",yytext[0]);
+[Cc]omputer printf("%clunker", yytext[0]);
+or printf("o'");
+president printf("super-dude");
+"prime minister" printf("prahm mistah");
+government printf("guv'ment");
+knew printf("knowed");
+[Bb]ecause printf("'%cuz", caseify('c'));
+[Yy]our printf("%co'", yytext[0]);
+[Ff]our printf("%coe", yytext[0]);
+got printf("gots");
+young printf("yung");
+you printf("ya'");
+You printf("You's");
+first printf("fust");
+police printf("honky pigs");
+{BW}string printf("%cchittlin'",yytext[0]);
+{BW}read printf("%ceyeball",yytext[0]);
+write printf("scribble");
+think{EW} { printf("thin'");plastc();}
+with printf("wif");
+other printf("uthu'");
+[Tt]hr printf("%c'r", yytext[0]);
+[Tt]h printf("%c", caseify('d'));
+ing printf("in'");
+{BW}a{EW} { printf("%csome",yytext[0]);plastc();}
+{BW}to{EW} { printf("%ct'",yytext[0]);
+ if(yytext[yyleng-1]!=' ')
+ plastc();
+ }
+tion printf("shun");
+[Aa]lmost printf("%cos'", caseify('m'));
+from printf("fum");
+[Yy]"ou're" printf("%couse", yytext[0]);
+alright |
+okay printf("coo'");
+[Aa]nd printf("%cn'", yytext[0]);
+known printf("knode");
+want printf("wants'");
+beat printf("whup'ed");
+ile printf("ah'l");
+er{EW} { printf("uh");plastc();}
+[a-z]sti printf("%cs'i", yytext[0]);
+tute printf("toot");
+exp printf("'sp");
+exs |
+exc printf("'s");
+{BW}ex printf("%c'es",yytext[0]);
+[ae]ct{EW} { printf("%cc'", yytext[0]); plastc(); }
+like printf("likes");
+done |
+did printf("dun did");
+"kind of" printf("kind'a");
+women printf("honky chicks");
+{BW}man{EW} { printf("%cdude",yytext[0]);plastc();}
+{BW}men{EW} |
+{BW}mens{EW} { printf("%cdudes",yytext[0]);plastc();}
+injured printf("hosed");
+killed |
+dead printf("wasted");
+good printf("baaaad");
+open{EW} { printf("jimmey");plastc();}
+opened{EW} { printf("jimmey'd");plastc();}
+{BW}very printf("%creal",yytext[0]);
+per printf("puh'");
+oar printf("o'");
+{BW}can printf("%ckin",yytext[0]);
+{BW}just{EW} { printf("%cplum",yytext[0]);plastc();}
+[Dd]etroit printf("Mo-town");
+[Ww]"estern "[Ee]"lectric" printf("da' cave");
+{BW}believe printf("%crecon'",yytext[0]);
+[Ii]"ndianapolis" printf("Nap-town");
+Daniel |
+Dan printf("Liva' Lips");
+Reagan printf("Kingfish");
+Ronald{EW} |
+Ron{EW} { printf("Rolo");plastc();}
+John printf("Rastus");
+Jim printf("Bo-Jangles");
+pontiff |
+pope printf("wiz'");
+[Pp]ravda printf("dat commie rag");
+broken printf("bugger'd");
+strange{EW} { printf("funky");plastc();}
+dance{EW} { printf("boogy");plastc();}
+ask printf("ax'");
+{BW}so{EW} { printf("%cso's",yytext[0]);plastc();}
+heard printf("'hoid");
+head printf("'haid");
+boss printf("main man");
+money printf("bre'd");
+[a-z]":" { *(yytext+1) = ',';
+ printf("%s dig dis:",yytext);
+ }
+amateur printf("begina'");
+radio printf("transista'");
+{BW}of{EW} { printf("%cuh",yytext[0]);plastc();}
+which |
+what printf("whut");
+"don't" printf("doan'");
+does printf("duz");
+{BW}was{EW} |
+{BW}were{EW} { printf("%cwuz",yytext[0]);plastc();}
+{BW}understand printf("%cdig",yytext[0]);
+{BW}my printf("%cmah'",yytext[0]);
+again |
+against printf("agin'");
+{BW}[Ii]{EW} { printf("%cah'",yytext[0]);plastc();}
+meta printf("meta-fuckin'");
+cally printf("c'l");
+%%
+
+caseify(c)
+char c;
+{
+ if (yytext[0] <= 'Z')
+ return (c - ' ');
+ else
+ return (c);
+}
+
+thing(c)
+char c;
+{
+ static short count = 0;
+
+ putchar(c);
+ switch (count++ % 4) {
+ case 0: case 2:
+ printf("thang");
+ break;
+ case 1:
+ printf("doohickey");
+ break;
+ case 3:
+ printf("wahtahmellun");
+ break;
+ }
+}
+expletive()
+{
+ static short count = 0;
+ static short which = 0;
+
+ if (count++ % 4 == 0) {
+ switch (which++ % 5) {
+ case 0: printf(" What it is, Mama!"); break;
+ case 1: printf(" Ya' know?"); break;
+ case 2: printf(" Sheeeiit."); break;
+ case 3: printf(" Ya' dig?"); break;
+ case 4: printf(" Git down!"); break;
+ }
+ }
+}
+
+/*
+ * Bugs:
+ *
+ * If a sentence starts with a keyword it doan' get converted, or:
+ * it do, but gets a leading space
+ */
--- /dev/null
+%{
+/*
+ * ken:
+ * will turn English into Cockney, featuring (dubious) rhyming slang for a lot
+ * of computer terminology.
+ *
+ * Written by Stephen K Mulrine <smulrine%cs.strath.ac.uk@nsfnet-relay.ac.uk>
+ * Make copies if you want etc.etc.
+ *
+ * Contacted author in June 2001, asked him to clarify the license, he replied
+ * with some improvements and placed the program in the public domain.
+ * -- Edward Betts <edward@debian.org> Mon, 11 Jun 2001 12:04:29 +0100
+ *
+ * ken is named after Ken the Chirpy Cockney Character from the Viz Comic (tm),
+ * who speaks somewhat like that.
+ */
+%}
+%e 3000
+%p 6000
+%n 1000
+%k 500
+%a 4000
+%o 2000
+BW [ ]
+EW [ .,;!?]
+%{
+ char buf[128];
+%}
+
+%%
+
+stairs printf("apples and pears");
+Downstairs printf("Down the apples and pears");
+downstairs printf("down the apples and pears");
+Upstairs printf("Up the apples and pears");
+upstairs printf("up the apples and pears");
+[Mm]outh printf("North and South");
+[Ff]ace printf("Boat Race");
+[Tt]rouble printf("Barney Rubble");
+wife { switch(rand()%2)
+ {
+ case 0: printf("trouble and strife"); break;
+ case 1: printf("ole lady"); break;
+ }
+ }
+Road printf("Frog and Toad");
+" road" printf(" frog and toad");
+"pub " printf("rub-a-dub ");
+" bar " printf(" boozer ");
+" husband" printf(" ole man");
+Party printf("Knees-up");
+party printf("knees-up");
+Parties printf("Knees-ups");
+parties printf("knees-ups");
+My printf("Me");
+" my" printf(" me");
+Your printf("Yer");
+your printf("yer");
+"You are " printf("Yer ");
+"you are " printf("yer ");
+You printf("Yer");
+you printf("yer");
+Those printf("Them");
+those printf("them");
+" those" printf(" them");
+"(those" printf("(them");
+"The " { switch(rand()%5)
+ {
+ case 0: printf("The bleedin' "); break;
+ default: ECHO; break;
+ }
+ }
+"The" ECHO;
+" the " { switch(rand()%5)
+ {
+ case 0: printf(" the bleedin' "); break;
+ default: ECHO; break;
+ }
+ }
+[" "(]the ECHO;
+"the " { switch(rand()%5)
+ {
+ case 0: printf(" the bleedin' "); break;
+ default: ECHO; break;
+ }
+ }
+[Tt]his ECHO;
+[" "(]this ECHO;
+[Tt]hat ECHO;
+[" "(]that ECHO;
+Thus printf("So");
+" thus" printf(" so");
+"(thus" printf("(so");
+"thus" printf("so");
+[Tt]han ECHO;
+[" "(]than ECHO;
+Who ECHO;
+who ECHO;
+" old " printf(" ole ");
+" to " printf(" ter ");
+"Aren't you " printf("Aintcha ");
+"aren't you " printf("aintcha ");
+"Aren't" printf("Ain't");
+"aren't" printf("ain't");
+"Isn't" printf("Ain't");
+"isn't" printf("ain't");
+"Are not " printf("Ain't");
+"are not " printf("ain't ");
+"Is not " printf("Ain't ");
+" is not " printf(" ain't ");
+"What is th" printf("Woss");
+"what is th" printf("woss");
+"What are you " printf("Wotcher ");
+"what are you " printf("wotcher ");
+"What you are" printf("Wotcher");
+"what you are" printf("wotcher");
+"What you're" printf("Wotcher");
+"what you're" printf("wotcher");
+"What are your" printf("Wotcher");
+"what are your" printf("wotcher");
+"What do you " printf("Wotcher ");
+"what do you " printf("wotcher ");
+"What do your" printf("Wotcher");
+"what do your" printf("wotcher");
+" "H[aeu]llo printf(" Wotcher");
+" "h[aeu]llo printf(" wotcher");
+What printf("Wot");
+what printf("wot");
+Were printf("Was");
+were printf("was");
+Bother printf("Ars");
+bother printf("ars");
+Mother printf("Muvver");
+Other printf("Uvver");
+other printf("uvver");
+Father printf("Favver");
+father printf("favver");
+Rather printf("Ravver");
+rather printf("ravver");
+Weather printf("Wevver");
+weather printf("wevver");
+Leather printf("Levver");
+leather printf("levver");
+Wither printf("Wivver");
+wither printf("wivver");
+Either printf("Eever");
+either printf("eever");
+With printf("Wiv");
+with printf("wiv");
+Anything printf("Anyfink");
+anything printf("anyfink");
+Something printf("Sumfink");
+something printf("sumfink");
+Nothing printf("Nuffink");
+nothing printf("nuffink");
+guitars printf("spoons");
+guitar printf("spoons");
+drums printf("spoons");
+drum printf("spoons");
+trumpets printf("spoons");
+trumpet printf("spoons");
+violins printf("spoons");
+violin printf("spoons");
+clarinets printf("spoons");
+clarinet printf("spoons");
+trombones printf("spoons");
+trombone printf("spoons");
+oboes printf("spoons");
+oboe printf("spoons");
+flutes printf("spoons");
+flute printf("spoons");
+tubas printf("spoons");
+tuba printf("spoons");
+Data printf("Info");
+data printf("info");
+Directory printf("Lockup");
+directory printf("lockup");
+Directories printf("Lockups");
+directories printf("lockups");
+[Pp]rocess { switch(rand()%2)
+ {
+ case 0: printf("Queen Bess"); break;
+ case 1: printf("Rudolf 'Ess"); break;
+ }
+ }
+[Cc]omputer printf("French Tutor");
+[Bb]yte printf("Jimmy White");
+[Ff]iles printf("Nobby Stiles");
+[Ff]ile printf("Royal Mile");
+[Ll]anguage printf("'Am Sandwich");
+[Zz]ero printf("Emperor Nero");
+[Jj]ob printf("Uncle Bob");
+[Ss]hell printf("Bow Bell");
+[Ss]ave printf("Chas'n'Dave");
+[Ll]oad printf("Old Kent Road");
+[Mm]ouse printf("Doll's 'Ouse");
+[Bb]uffer printf("Sausage Stuffer");
+[Kk]eyboard printf("Henry Ford");
+[Mm]anual printf("Cocker Spaniel");
+[Ss]creen printf("James Dean");
+[Pp]rinter printf("'Arold Pinter");
+[Pp]lotter printf("Pansy Potter");
+[Cc]ompiler printf("Martin Tyler");
+[Ss]tring printf("Emperor Ming");
+[Bb]rain printf("Michael Caine");
+[Pp][Aa][Ss][Cc][Aa][Ll] { switch(rand()%2)
+ {
+ case 0: printf("Pall Mall"); break;
+ case 1: printf("Roald Dahl"); break;
+ }
+ }
+[Aa][Ll][Gg][Oo][Ll] printf("Johnny Ball");
+[Ff][Oo][Rr][Tt][Rr][Aa][Nn] printf("Manfred Mann");
+[Cc][Oo][Bb][Oo][Ll] printf("Albert Hall");
+[Jj]ava printf("Wot a palavah");
+W[aA][pP] printf("Pony and trap");
+" wap" printf(" pony and trap");
+Stopped printf("'Ad the mockers put on");
+stopped printf("'ad the mockers put on");
+Stopping printf("Putting the mockers on");
+stopping printf("putting the mockers on");
+stops printf("puts the mockers on");
+stop printf("put the mockers on");
+STOP printf("Put The Mockers On");
+[Ll]ondoner printf("Cockney");
+friend { switch(rand()%3)
+ {
+ case 0: printf("mucker"); break;
+ case 1: printf("mate"); break;
+ case 2: printf("china"); break;
+ }
+ }
+"a h" printf("an '");
+"A h" printf("An '");
+" h" printf(" '");
+" H" printf(" '");
+" C-" printf(" Bruce Lee-");
+" C " { switch(rand()%4)
+ {
+ case 0: printf(" Bruce Lee "); break;
+ case 1: printf(" Circus Flea "); break;
+ case 2: printf(" Bumble Bee "); break;
+ case 3: printf(" Door Key "); break;
+ }
+ }
+" C." printf(" Circus Flea.");
+Th printf("F");
+Wh printf("W");
+wh printf("w");
+aw printf("or");
+" "[BbKkMmPpRrSsWw]ing ECHO;
+" "[Bb]ring ECHO;
+" "[Ss]ting ECHO;
+" "[Ss]wing ECHO;
+" "[CcFfSs]ling ECHO;
+" Thing" printf(" Fing");
+" thing" printf(" fing");
+
+"ing " printf("in' ");
+". " { switch(rand()%32)
+ {
+ case 0: printf(". I'll get out me spoons. "); break;
+ case 1: printf(". Yer can't 'ave a knees-up wivout a joanna. "); break;
+ case 2: printf(". Cor blimey guv, would I lie to you. "); break;
+ case 3: printf(". I'll make us all a nice cup of tea. "); break;
+ default: ECHO; break;
+ }
+ }
+"? " { switch(rand()%3)
+ {
+ case 0: printf(", mate? "); break;
+ case 1: printf(", guv? "); break;
+ case 2: printf(", squire? "); break;
+ }
+ }
+"! " { switch(rand()%6)
+ {
+ case 0: printf(", cor blimey! "); break;
+ case 1: printf("! Struth! "); break;
+ case 2: printf(", guv! "); break;
+ case 3: printf("! Honest guv! "); break;
+ case 4: printf(", mate! "); break;
+ case 5: ECHO; break;
+ }
+ }
+. printf("%s", yytext);
+\n printf("\n");
+%%
--- /dev/null
+#!/usr/bin/perl -w
+#
+# kenny.pl -- translate from and to KennySpeak
+#
+# $Revision: 1.7 $
+#
+# Licensed unter the Artistic License:
+# http://www.perl.com/language/misc/Artistic.html
+#
+# (C) 2001,2002 by Christian Garbs <mitch@cgarbs.de>, http://www.cgarbs.de
+# Alan Eldridge <alane@geeksrus.net>
+#
+# KennySpeak invented by Kohan Ikin <syneryder@namesuppressed.com>
+# http://www.namesuppressed.com/kenny/
+
+#
+# $Id: kenny.pl,v 1.7 2002/01/06 22:09:52 mitch Exp $
+#
+
+use strict;
+
+#
+# This is Perl POD documentation.
+# You can generate a nice manpage with "pod2man kenny.pl > kenny.man".
+# Or have a look at "perldoc perlpod" for other options
+#
+
+=head1 NAME
+
+kenny.pl -- translate from and to KennySpeak
+
+=head1 SYNOPSIS
+
+B<kenny.pl>
+S<[ B<-h> ]>
+S<[ B<-u> ]>
+S<[ B<-k> | B<-d> ]>
+S<[ I<file1> ] [ I<file2> ] ...>
+
+=head1 OVERVIEW
+
+kenny.pl translates a given text from or to B<KennySpeak>. KennySpeak
+looks like this:
+
+ "Ppfmfp ppmffm mfmppfmpm, fmpmfpmppffm'fpmmpp
+ pmpmffpmfpmfmppmpm Pmpmppppppppffm!"
+
+=head1 DESCRIPTION
+
+kenny.pl will read the given filenames, translate them and print the
+results on stdout. If you don't give a filename, stdin is used. A F<->
+as a filename means stdin.
+
+Without any parameters, kenny.pl will look at the first line of input
+and guess which way you want to translate. If kenny.pl guesses wrong,
+you must select the translation mode using the B<-k> or B<-d> switch.
+
+=head2 Switches
+
+=over 5
+
+=item B<-h>
+
+This will print a short notice and a quick summary of the available
+switches.
+
+=item B<-u>
+
+This will convert German umlauts to Ae, Oe, Ue, ae, oe, ue and ss
+so that they can be kennyfied correctly.
+
+=item B<-k>
+
+Kennyfy. This forces the input to be translated into KennySpeak.
+
+=item B<-d>
+
+Dekennyfy. This forces the input to be translated back from
+KennySpeak.
+
+=back
+
+=head1 VERSION
+
+This is $Revision: 1.7 $.
+
+=head1 BUGS
+
+The B<-u> switch might not work for charsets other than Latin-1. You
+might try to convert the kenny.pl script using B<recode> to change it
+from Latin-1 to your preferred charset.
+
+=head1 CREDITS
+
+kenny.pl was written by B<Christian Garbs>. Look on his homepage for
+newer versions of kenny.pl. Bug reports or comments about the program
+should be sent to him:
+ Christian Garbs <F<mitch@cgarbs.de>>
+ F<http://www.cgarbs.de/weird.en.html>
+
+KennySpeak was invented by B<Kohan Ikin>. See his homepage for an
+online version of the original B<KennyTranslator>:
+ Kohan Ikin <F<syneryder@namesuppressed.com>>
+ F<http://www.namesuppressed.com/kenny/>
+
+Alan Eldridge <F<alane@geeksrus.net>> patched in a signal handler to
+print an appropriate message when kenny.pl is killed.
+
+=head1 COPYRIGHT
+
+kenny.pl is licensed unter the B<Artistic License> which can be found
+at F<http://www.perl.com/language/misc/Artistic.html>. This license
+has been chosen for keeping compatibility with the original KennySpeak
+format.
+
+=cut
+
+
+
+######################################################################
+#
+# CHANGELOG
+#
+# $Log: kenny.pl,v $
+# Revision 1.7 2002/01/06 22:09:52 mitch
+# Included patch by Alan Eldridge <alane@geeksrus.net>
+# to show a message when kenny.pl is killed.
+#
+# Revision 1.6 2001/07/20 19:04:49 mitch
+# Removed warnings with Perl 5.6.
+# Thanks go to Alan Eldridge <alane@geeksrus.net>
+#
+# Revision 1.5 2001/07/15 10:27:57 mitch
+# Included notice about -u and charsets other than Latin-1.
+#
+# Revision 1.4 2001/07/14 13:16:30 mitch
+# Initial release.
+#
+#
+#
+######################################################################
+
+
+
+#
+# finally{}, the source code!
+#
+
+
+
+##### Declaration of function prototypes
+
+sub generateKenny();
+sub generateDeKenny($);
+sub guessDialect($);
+sub translate($);
+sub addGermanUmlauts($);
+sub printHelp();
+sub theyKilledKenny();
+
+
+
+##### Default values for various option:
+
+my $dialect = 0; # Translate from or to KennySpeak?
+ # 0=guess, 1=encode, 2=decode
+
+my $umlauts = 0; # Convert German Umlauts before translation?
+ # TRUE=ÄÖÜäöüß => Ae, Oe, Ue, ae, ou, ue, ss
+
+
+
+##### The KennySpeak translation tables:
+
+my $kenny = generateKenny(); # encoding table
+my $dekenny = generateDeKenny($kenny); # decoding table
+
+
+
+##### Install signal handlers
+
+$SIG{HUP} = \&theyKilledKenny;
+$SIG{INT} = \&theyKilledKenny;
+$SIG{QUIT} = \&theyKilledKenny;
+$SIG{TERM} = \&theyKilledKenny;
+
+
+
+##### Parse commandline arguments
+
+# "-h" switch (print help):
+
+if (grep /^-h$/, @ARGV) {
+ printHelp();
+ exit 0;
+}
+
+# "-u" switch (convert German umlauts):
+
+if ((defined $ARGV[0]) && ($ARGV[0] eq "-u")) {
+ $umlauts = 1;
+ shift @ARGV;
+} elsif ((defined $ARGV[1]) && ($ARGV[1] eq "-u")) {
+ $umlauts = 1;
+ splice @ARGV, 1, 1;
+}
+
+# "-k" and "-d" switch (force encoding/decoding):
+
+if (defined $ARGV[0]) {
+ if ($ARGV[0] eq "-k") {
+ $dialect = 1;
+ shift @ARGV;
+ } elsif ($ARGV[0] eq "-d") {
+ $dialect = 2;
+ shift @ARGV;
+ }
+}
+
+
+
+##### add German umlauts to encoding if desired:
+
+if ($umlauts) {
+ addGermanUmlauts($kenny);
+}
+
+
+
+##### Process the given input files (or stdin of none given)
+
+while (my $line=<>) {
+ chomp $line;
+ $dialect = guessDialect($line) unless $dialect;
+ $line = translate($line);
+ print "$line\n";
+}
+
+
+
+##### That's all, folks!
+
+exit 0;
+
+
+##### Signal handler, if we're kill(1)ed
+
+sub theyKilledKenny()
+{
+ print "Oh my God! They killed Kenny! You bastards!\n";
+ exit 0;
+}
+
+
+
+##### Guess whether input is already kennyfied:
+
+sub guessDialect($)
+{
+ my $line = shift;
+ $line =~ tr/a-zA-Z//cd;
+ if (($line =~ tr/mfpMFP//c) > 0) {
+ return 1;
+ } else {
+ return 2;
+ }
+}
+
+
+
+##### Encode/decode a given line
+
+sub translate($)
+{
+ my $in = shift;
+ my $out = "";
+ if ($dialect == 1)
+ {
+ $out .= exists $kenny->{$1} ? $kenny->{$1} : $1 while ($in =~ s/^(.)//);
+ } else {
+ my @chars = split //, $in;
+ while (@chars) {
+ if ((@chars > 2) and (exists $dekenny->{$chars[0]}->{$chars[1]}->{$chars[2]})) {
+ $out .= $dekenny->{$chars[0]}->{$chars[1]}->{$chars[2]};
+ shift @chars;
+ shift @chars;
+ shift @chars;
+ } else {
+ $out .= shift @chars;
+ }
+ }
+ }
+ return $out;
+}
+
+
+
+##### Generate KennySpeak encoding table
+
+sub generateKenny()
+{
+ my %kenny;
+
+ # lower case characters
+
+ my ($a, $b, $c) = (0,0,0);
+ for my $char ("a".."z") {
+ my $foo = $a.$b.$c;
+ $foo =~ tr/012/mpf/;
+ $kenny{$char} = $foo;
+ $c++;
+ if ($c == 3) {
+ $c=0;
+ $b++;
+ if ($b == 3) {
+ $b=0;
+ $a++;
+ }
+ }
+ }
+
+ # upper case characters
+
+ map { $kenny{uc $_} = ucfirst $kenny{$_} } keys %kenny;
+
+ return \%kenny;
+}
+
+
+
+##### Generate KennySpeak decoding table
+
+sub generateDeKenny($)
+{
+ my %dekenny;
+ my $kenny = $_[0];
+ foreach my $key (keys %{$kenny})
+ {
+ my ($a, $b, $c) = split //, $kenny->{$key};
+ if (! exists $dekenny{$a}) {
+ $dekenny{$a} = {};
+ }
+ if (! exists $dekenny{$a}->{$b}) {
+ $dekenny{$a}->{$b} = {};
+ }
+ $dekenny{$a}->{$b}->{$c} = $key;
+ }
+
+ return \%dekenny;
+}
+
+
+
+##### Add German Umlaut conversion to KennySpeak encoding table
+
+sub addGermanUmlauts($)
+{
+ my $kenny = $_[0];
+ $kenny->{"ä"} = $kenny->{"a"} . $kenny->{"e"};
+ $kenny->{"ö"} = $kenny->{"o"} . $kenny->{"e"};
+ $kenny->{"ü"} = $kenny->{"u"} . $kenny->{"e"};
+ $kenny->{"Ä"} = $kenny->{"A"} . $kenny->{"e"};
+ $kenny->{"Ö"} = $kenny->{"O"} . $kenny->{"e"};
+ $kenny->{"Ü"} = $kenny->{"U"} . $kenny->{"e"};
+ $kenny->{"ß"} = $kenny->{"s"} x 2;
+}
+
+
+
+##### Print short help message
+
+sub printHelp()
+{
+ print <<'EOF';
+kenny.pl $Revision: 1.7 $ by Christian Garbs <mitch@cgarbs.de>
+Use "pod2man kenny.pl > kenny.man" to generate the man page.
+Usage: kenny.pl [ -h ] [ -u ] [ -k | -d ] [ file1 ] [ file2 ] ...
+-h : print this help message
+-u : convert German umlauts before translation
+-k : force encoding to KennySpeak
+-d : force decoding from KennySpeak
+EOF
+ ;
+}
--- /dev/null
+ Kraut
+ +++++++++++++++++
+Compiling Kraut:
+
+You should have the files: kraut.c and kraut.l and lex.yy.c
+
+
+kraut.l must be run thru the unix 'lex' utility to produce the file lex.yy.c
+Then compile kraut.c and lex.yy.c to produce kraut
+
+ $lex kraut.l
+ $cc kraut.c lex.yy.c -o kraut
+ (You may get a list of warnings from the compiler. Ignore them.)
+
+Note: lex.yy.c is included in this package. You only need to use lex if you
+wish to make changes to kraut.
+
+Using Kraut:
+
+ Kraut uses standard input and output.
+
+examples:
+
+To translate a file called 'note' and output kraut to a file called 'knote':
+
+ $ cat note | kraut > knote
+
+To translate a file called 'note' and just print it to the screen:
+
+ $ cat note | kraut
+
+To have kraut wait to translate what you type at the keyboard and return it in
+kraut on your screen:
+
+ $ kraut
+
--- /dev/null
+#include <stdio.h>
+/* Kraut v0.9 */
+/* by */
+/* John Sparks */
+/* 5-5-1989 */
+
+/* This is in the public domain. Do with it as you will. */
+
+const char *yylex(void);
+
+int main()
+{
+ char *line;
+
+ while((line = (char *) yylex())) {
+ printf("%s", line);
+ }
+
+ return 0;
+}
+
+int yywrap ()
+{
+ return (1);
+}
--- /dev/null
+%e 2000
+%p 5000
+%n 1000
+%k 500
+%a 4000
+%o 2000
+BW [ ]
+EW [ .,;!?]
+
+%{
+#define YY_DECL const char *yylex(void)
+ char buf[128];
+
+%}
+
+%%
+ing return("ingkt");
+" the " return(" ze ");
+"The " return("Ze ");
+" with " return(" mitt ");
+"With " return("Mitt ");
+wr return("w-r-r");
+Wr return("W-r-r");
+R return("R-r-r");
+"Yes " return("Jawohl ");
+" r" return(" r-r-r");
+"Yes." return("Jawohl.");
+"Yes!" return("Jawohl!");
+"YES!" return("JAWOHL!");
+" yes " return(" ja ");
+" yes." return(" ja.");
+" yes!" return(" yes!");
+"No " return("Nein ");
+"No!" return("Nein!");
+"No?" return("Nein?");
+" no " return(" nein ");
+" no." return(" nein.");
+" no!" return(" nein!");
+" no?" return(" nein?");
+[Mm]"r." return("Herr");
+[Mm]"rs." return("Frau");
+Miss return("Fraulein");
+" of " return(" uff ");
+"Of " return("Uff ");
+my return("mein");
+My return("Mein");
+" and " return(" undt ");
+"And " return("Undt ");
+"One " return("Ein ");
+" one" return(" ein");
+"Is " return("Ist ");
+" is " return(" ist ");
+"ow " return("ow ");
+"w " return("w ");
+sh return("sch");
+Sh return("Sch");
+ch return("ch");
+Ch return("Ch");
+" c" return(" k");
+" C" return(" K");
+
+v return("f");
+V return("F");
+" w" return(" v");
+W return("V");
+th return("d");
+Th return("D");
+[Jj]ohn return("Johann");
+[Ww]illiam return("Wilhelm");
+[Bb]rad return("Wilhelm");
+[Gg]ary return("Gerhardt");
+[Jj]on return("Hansel");
+
+[a-f]"!" {sprintf(buf,"%s Naturlich!",yytext);return(buf);}
+[p-z]"!" {sprintf(buf,"%s Sieg Heil!",yytext);return(buf);}
+. return(yytext);
+\n return("\n");
+
+%%
+
+
--- /dev/null
+This program is (c) 1994, Brent E. Edwards. Feel free to distribute the
+complete program world-wide. (Please do NOT break apart this text file
+from the program.)
+
+This program is under absolutely no warrantee of any kind.
+
+If you have any questions about this program, please send them to
+edwardsb@cs.rpi.edu.
+
+This program is dedicated to Conrad Wong.
+
+This program is catware. If you find it useful in any way, pay for this
+program by spending one hour petting one or several cats.
+
+[ Revised to plain GPL by author, see copyright file. -- Joey Hess ]
+
+===================================================
+
+
+Purpose:
+ This program places a very cute (and familiar to FurryMuck fans)
+ accent to any text file. It is designed for UNIX systems.
+ It requires cc, lex, and yacc to be in your path.
+
+Compiling:
+ To compile on a UNIX system, type 'make'
+
+Running:
+ To do a line-by-line translation of your text, type 'ky00te'.
+ Control-D will halt the program.
+
+ To convert a text file and display it on the screen, type
+ 'ky00te < filename | more', where filename is the file to convert.
+
+ To convert a text file and save it to a file, type
+ 'ky00te < filename.in > filename.out', where filename.in is the
+ file to convert and filename.out is the place to put it.
+
+ You can also add an accent to the output of any program by
+ typing '<normal program execution> | ky00te'.
+
+Petting the cat:
+ Stroke with the furs, not against them.
+
+====================================================
+
+Program version information:
+
+Program version 1.00: 13 December 1994
+
+Program version 1.10: 15 December 1994
+ Version 1.00 was a memory hog. Also, adds 'fur' and 'meow' to
+list of cat-ch phrases.
+
+Program version 1.11: 16 December 1994
+ With Tobias Kuhler's (ukjp@rz.uni-karlsruhe.de) repeated suggestion,
+ the program now only doubles (not triples) 'r' and no longer capitalizes
+ fur. He also suggested the following improvements:
+ at a, at the -> atta
+ in a, in the -> ynna
+ is a, is the -> yssa
+ on a, on the -> onna
+ with a, with the -> wyffa
+ the -> da
+ you -> ya
+ and -> 'n
+ with -> wyf
+ to -> ta
+
+ This version also no longer uses the same 'meow'; it switches between
+ 'meow', 'mew', and 'mu' (weighted to the first).
+
+ I've also added:
+ lot of -> lotta
+ is so -> yssa
+ when -> w'en
+ with -> wyf (when used to start a word)
+ your -> yer
+ not, n't -> na'
+
+
+ The README file has been reorganized, and the dedication made explicit.
+
--- /dev/null
+%{
+
+#include "y.tab.h"
+extern int yylval;
+
+%}
+
+%%
+i { yylval = 'y'; return(LETTER); }
+I { yylval = 'Y'; return(LETTER); }
+cks { yylval = 'x'; return(LETTER); }
+ks { yylval = 'x'; return(LETTER); }
+cute { return(CUTE); }
+fluff { return(FLUFF); }
+smile { return(SMILE); }
+grin { return(SMILE); }
+laugh { return(SMILE); }
+chuckle { return(SMILE); }
+pr { return(PURR); }
+p[aeiou]*r { return(PURR); }
+f[aeiou]+r { return(FUR); }
+m[aeiou]+/[^.,s?! ] { return(MEOW); } /*UN*/
+"at a" { return(ATTA); }
+"at the" { return(ATTA); }
+"in a" { return(YNNA); }
+"in the" { return(YNNA); }
+"is a" { return(YSSA); }
+"is the" { return(YSSA); }
+"is so" { return(YSSA); }
+"on a" { return(ONNA); }
+"on the" { return(ONNA); }
+"with a" { return(WYFFA); }
+"with the" { return(WYFFA); }
+"lot of" { return(LOTTA); }
+" with " { return(WYF); }
+" with" { return(WYFF); }
+^"with " { return(WYF); }
+^"with" { return(WYFF); }
+" with"$ { return(WYF); }
+" the " { return(DA); }
+^"the " { return(DA); }
+" the"$ { return(DA); }
+" your" { return(YER); }
+^your { return(YER); }
+" you" { return(YA); }
+^you { return(YA); }
+" and " { return(AN); }
+^"and " { return(AN); }
+" and"$ { return(AN); }
+" to " { return(TA); }
+^"to " { return(TA); }
+" to"$ { return(TA); }
+" when " { return(WEN); }
+^"when " { return(WEN); }
+" when"$ { return(WEN); }
+"n't" { return(NA); } /*UN*/
+" not" { return(NA); } /*UN*/
+[ \t] { return(' '); }
+. { yylval = yytext[0]; return(LETTER); }
+%%
+
+
+
+
--- /dev/null
+%{
+
+#include <stdio.h>
+typedef int INT;
+
+#define YYSTYPE INT
+
+%}
+
+%token CUTE
+%token FLUFF
+%token SMILE
+%token PURR
+%token FUR
+%token MEOW
+%token ATTA
+%token YNNA
+%token YSSA
+%token ONNA
+%token WYFFA
+%token LOTTA
+%token WYF
+%token WYFF
+%token DA
+%token YER
+%token YA
+%token AN
+%token TA
+%token WEN
+%token NA /*UN*/
+%token LETTER
+
+%%
+
+s:
+ | s t
+ | s ' '
+ {
+ if (rand() % 30 < 1)
+ {
+ int inRand;
+
+ inRand = rand() % 5;
+
+ switch(inRand)
+ {
+ case 0:
+ printf(" *truffle break!* ");
+ break;
+
+ case 1:
+ printf(" *catnap break!* ");
+ break;
+
+ case 2:
+ printf(" *purrpurr* ");
+ break;
+
+ case 3:
+ printf(" *meow!* ");
+ break;
+
+ case 4:
+ printf(" *fluff!* ");
+ break;
+ }
+ }
+ else
+ {
+ printf(" ");
+ }
+ }
+ ;
+
+t: CUTE { printf("ky00te!"); }
+ | FLUFF { printf("*fluff!*"); }
+ | SMILE { printf("};)"); }
+ | PURR { printf("purr"); }
+ | FUR { printf("fur"); }
+ | MEOW { int inRand;
+
+ inRand = rand() % 5;
+
+ switch(inRand)
+ {
+ case 0:
+ case 1:
+ case 2:
+ printf("meow");
+ break;
+ case 3:
+ case 4:
+ printf("mew");
+ }
+ }
+ | ATTA { printf("atta"); }
+ | YNNA { printf("ynna"); }
+ | YSSA { printf("yssa"); }
+ | ONNA { printf("onna"); }
+ | WYFFA { printf("wyffa"); }
+ | LOTTA { printf("lotta"); }
+ | WYF { printf(" wyf "); }
+ | WYFF { printf(" wyff"); }
+ | DA { printf(" da "); }
+ | YER { printf(" yer"); }
+ | YA { printf(" ya"); }
+ | AN { printf(" 'n "); }
+ | TA { printf(" ta "); }
+ | WEN { printf(" w'en "); }
+ | NA { printf(" na'"); } /*UN*/
+ | LETTER { if (yylval == 'r')
+ printf("rr");
+ else
+ printf("%c", $1); }
+ ;
+
+
+%%
+
+extern char mylval;
+
+int yyerror(char *s) {
+ printf("%s\n",s);
+}
+
+int main()
+{
+ yyparse();
+
+ return 0;
+}
+
+
--- /dev/null
+all: ../ky00te
+
+clean:
+ rm -f y.tab.* lex.yy.*
+ rm -f ../ky00te
+
+../ky00te: y.tab.o lex.yy.o
+ $(CC) -o ../ky00te lex.yy.o y.tab.o $(CFLAGS)
+
+lex.yy.o: lex.yy.c y.tab.h
+ $(CC) $(CFLAGS) -c lex.yy.c
+
+y.tab.o: y.tab.c
+ $(CC) $(CFLAGS) -c y.tab.c
+
+lex.yy.c: ky00te.lex
+ flex ky00te.lex
+
+y.tab.c: ky00te.yacc
+ yacc -d ky00te.yacc
+
--- /dev/null
+#!/usr/bin/perl -p
+# lolcatz filtur
+# Copyright 2013 by Joey Hess under the terms of the GNU GPL.
+
+# an array, not a hash. because order is important
+@trans_table=(
+ 'can i' => 'i can',
+ '\bi\'ve' => 'i',
+ '\ba\s+' => '', # nuke 'a'
+ 'cheese' => 'cheez',
+ '\brock\b' => 'rawk',
+ 'ese\b' => 'ees',
+ 's\'s\b' => 's',
+ '\'s\b' => 's',
+ 'er\b' => 'r',
+ 'ture\b' => 'chur',
+ 'day' => 'dai',
+ '\bok\b' => 'k',
+ '\boks\b' => 'ks',
+ 'boy' => 'boi',
+ 'tion' => 'shun',
+ 'ight' => 'ite',
+ 'innocent' => 'innozent',
+ 'ph' => 'f',
+ 'es' => 'ez',
+ 'ed\b' => 'd',
+ 'ns' => 'nz',
+ 'ks' => 'kz',
+ 'ds' => 'dz',
+ 'se' => 'ze',
+ 'zs' => 's',
+ 'sz' => 'z',
+ 'ss' => 's',
+ 'cc' => 'cs',
+ 'ck' => 'k',
+ 'oa' => 'o',
+ '\bcat' => 'kat',
+ 'ive\b' => 'iv',
+ 'ake' => 'aek',
+ 'ed\b' => 'd',
+ 'ing\b' => 'in',
+ 'sion' => 'shun',
+ '\bam\b' => 'iz',
+ '\bhave\b' => 'has',
+ '\bwho' => 'hoo',
+ '\bwake\b' => 'waek',
+ '\bone\b' => '1',
+ '\btwo\b' => '2',
+ '\bto\b' => '2',
+ '\btoo\b' => '2',
+ '\bthree\b' => '3',
+ '\bfour\b' => '4',
+ '\bfor\b' => '4',
+ '\bfore\b' => '4',
+ '\bfive\b' => '5',
+ '\bsix\b' => '6',
+ '\bseven\b' => '7',
+ '\beight\b' => '8',
+ '\bnine\b' => '9',
+ '\bten\b' => '10',
+ 'god' => 'ceilin cat',
+ 'jezus' => 'jebus',
+ 'kitty' => 'kitteh',
+ 'saturdai' => 'katurdai',
+ 'allah' => 'invisible man',
+ 'delicious' => 'delishus',
+ '\bdoctor\b' => 'docta',
+ '\bdr\b' => 'docta',
+ '\bgay\b' => 'ghey',
+ '\bgood\b' => 'gud',
+ '\bever' => 'evr',
+ '\bpage\b' => 'paeg',
+ 'cheezburgr' => 'cheezburger', # fix up to canonical form
+);
+
+y/A-Z/a-z/;
+
+while (@trans_table) {
+ $key=shift @trans_table;
+ $value=shift @trans_table;
+ s/$key/$value/g;
+}
+
+s/es/ez/g;
+
+y/a-z/A-Z/;
--- /dev/null
+#!/bin/sh -e
+chmod +x $1
+echo $1 >>SAMPLES
+echo "-------------" >>SAMPLES
+if [ "$1" != fanboy ]; then
+ printf "Here's how this filter sounds, in everyday use.\nNow is the time for all good men to come to the aid of their country." | ./$1 >>SAMPLES
+else
+ printf "This filter has to be tried on real world text to be understood! Oh, and Ubuntu Rules!" >>SAMPLES
+fi
+echo "" >>SAMPLES
+echo "" >>SAMPLES
--- /dev/null
+../nethackify:
+ gcc nethackify.c -o ../nethackify
+
+test:
+ @../nethackify The kitten bites.--More--
+ @../nethackify You begin praying to Odin. You finish your prayer.--More--
+ @../nethackify A black glow surrounds you.
+
+clean:
+ rm -f ../nethackify
+
+install:
+ cp ../nethackify /usr/bin
+
+uninstall:
+ rm /usr/bin/nethackify
--- /dev/null
+
+/*
+nethackify
+tries to write text ala nethack
+
+cat /etc/motd/ | nethackify
+/exec -o nethackify "good morning :)"
+
+gurkan@linuks.mine.nu
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/time.h>
+
+char *normal ="ABCDEFGHIKLMNOPQRTUVWZbdeghjklmnoqwy:;01678";
+char *nethack1="^P(|||C||||||CFCP|J/V/|cccni||nrccvv.,C|o/3";
+char *nethack2="?b?)F-(-?<_??(?(F???/??|??????r???????(???o";
+char *nethack3=" [ [L \\ ";
+char *nethack4=" [ \\ ";
+char *nethack5=" _ \\ ";
+
+int myrandom(float max)
+{
+ return ((int)(max*rand()/(RAND_MAX+1.0)));
+}
+
+void nethackify(char* str)
+{
+ int i,c;
+ for(i=0; i<strlen(str); i++) {
+ for(c=0; c<strlen(normal); c++) {
+ if(normal[c]==str[i]) {
+ if (myrandom(3)>0) {
+ switch(myrandom(5)) {
+ case 4: if(nethack5[c]!=' ') str[i]=nethack5[c];
+ case 3: if(nethack4[c]!=' ') str[i]=nethack4[c];
+ case 2: if(nethack3[c]!=' ') str[i]=nethack3[c]; break;
+ case 1: if(nethack2[c]!=' ') str[i]=nethack2[c]; break;
+ case 0: str[i]=nethack1[c]; break;
+ default: break;
+ }
+ }
+ }
+ }
+ printf("%c",str[i]);
+ }
+
+ printf(" ");
+}
+
+int main(int argc, char **argv)
+{
+ int i,c;
+ struct timeval tv;
+ FILE *f;
+ char ch[1];
+
+ srand((gettimeofday(&tv,NULL),tv.tv_usec));
+ if (argc==1) {
+ f=stdin;
+ while(fread(ch,1,1,f)) {
+ for(c=0; c<strlen(normal); c++) {
+ if(normal[c]==ch[0]) {
+ switch(myrandom(5)) {
+ case 4: if(nethack5[c]!=' ') ch[0]=nethack5[c];
+ case 3: if(nethack4[c]!=' ') ch[0]=nethack4[c];
+ case 2: if(nethack3[c]!=' ') ch[0]=nethack3[c]; break;
+ case 1: if(nethack2[c]!=' ') ch[0]=nethack2[c]; break;
+ case 0: ch[0]=nethack1[c]; break;
+ default: break;
+ }
+ }
+ }
+ printf("%c",ch[0]);
+ }
+ fclose(f);
+ } else {
+ for(i=1; i<argc; i++) {
+ nethackify(argv[i]);
+ }
+ printf("\n");
+ }
+
+ return 0;
+}
--- /dev/null
+
+nethackify
+tries to write text ala nethack
+
+cat /etc/motd/ | nhprint
+/exec -o nhprint "good morning :)"
+
+released under the gpl
+copyright 2004 by Gürkan Sengün <gurkan@linuks.mine.nu>
--- /dev/null
+%{ -*- Mode:Fundamental -*-
+/*
+ * newspeak.l, version 1.1.
+ * Lex filter to transform plain English into NewSpeak.
+ * Copyright (c) 1991 Jamie Zawinski <jwz@jwz.org>.
+ *
+ * Permission to use, copy, modify, distribute, and sell this
+ * software and its documentation for any purpose is hereby granted
+ * without fee, provided that the above copyright notice appear in
+ * all copies and that both that copyright notice and this
+ * permission notice appear in supporting documentation. No
+ * representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * To compile:
+ *
+ * flex newspeak.l
+ * cc -O -o newspeak lex.yy.c
+ * rm lex.yy.c
+ *
+ * This must be compiled with "flex", not normal "lex". Lex has
+ * some builtin, unchangable limits which this program exceeds.
+ * This has been verified to work with flex version 2.3.7, and
+ * may not work with flex version 2.3.6.
+ *
+ * You can get 'flex' by anonymous FTP to prep.ai.mit.edu, or
+ * anywhere else you get GNU software.
+ *
+ * Run this like so: "newspeak < some-text-file | more"
+ *
+ * There are some design notes near the end. Suggestions and
+ * improvements to this code are more than welcome.
+ * Hail Big Brother!
+ *---------------------------------------------------------------------------
+ */
+#include <stdio.h>
+
+unsigned int fcounter = 0;
+
+#define Y0 yytext[0]
+#define Y1 yytext[1]
+#define Y2 yytext[2]
+#define Y3 yytext[3]
+#define C caseify
+#define C1 caseify1
+
+#define CAP(string) capstring(0, (string),0)
+#define WCAP(string) capstring(Y0,(string),1)
+
+#define COMP(string1,string2) compstring(0, (string1),(string2),0)
+#define WCOMP(string1,string2) compstring(Y0,(string1),(string2),1)
+
+#define DUMP() printf("%s",yytext)
+%}
+
+%e 8000
+%p 9000
+%n 2000
+%k 3000
+%a 5000
+%o 4000
+
+W (([ ]?\n[ ]*)|[ ]|[\"'`])
+ES [.,;:!?/]
+EW ({W}|{ES}|"'")
+
+YOUNG (([Yy]oung|[Ss]mall|[Ll]ittle){W})
+DEAD (([Dd]ead|[Dd]eceased){W})
+THE ([Tt]he{W}?)
+ANDOR ({W}(([Aa]nd)|([Oo]r)){W}?)
+COLOR (red|green|blue|yellow|cyan|magenta|purple|orange|mauve|pink|turquoise|brown|gr[ae]y)
+
+%%
+
+%{
+ /******************************
+ * PLUSwords *
+ ******************************/
+%}
+
+[Qq]uite{EW}/[A-Za-z][A-Za-z] CAP("plus");
+[Rr]ather{EW}/[A-Za-z][A-Za-z][A-Za-z] CAP("plus");
+[Kk]ind{EW}of{EW}/[A-Za-z][A-Za-z][A-Za-z] CAP("plus");
+[Kk]inda{EW}/[A-Za-z][A-Za-z][A-Za-z] CAP("plus");
+[Mm]ore{W}than{W}a{W}(little|bit){W} CAP("plus");
+[Pp]ro- CAP("plus");
+
+[Hh]undreds{W}of{W}[Tt]housands |
+[Hh]undreds{ANDOR}[Tt]housands |
+[Hh]undreds{W}if{W}not{W}[Tt]housands |
+[Tt]housands |
+[Mm]illions CAP("doubleplusmany");
+
+[Dd]ozens CAP("many");
+[Hh]undreds CAP("plusmany");
+
+([Bb]right|[Ll]ight|[Ii]ntense){W}/{COLOR} CAP("plus");
+([Dd]im|[Ff]aded|[Dd]ark|[Pp]ale){W}/{COLOR} CAP("plusun");
+([Dd]im|[Ff]aded|[Dd]ark|[Pp]ale) CAP("unlight");
+
+[Ee]very DUMP();
+[Vv]ery{W} |
+[Rr]eally{W} |
+[Tt]erribly{W} |
+[Aa]wesome({W})? |
+[Aa]wfully{W} CAP("doubleplus");
+
+[Ww]hopping{EW} CAP("plusbig");
+
+"O.K." |
+[Aa]ll({W})?[Rr]ight |
+[Oo][Kk][Aa][Yy] CAP("plusgood");
+{W}OK/{W} WCAP("plusgood");
+
+([Tt]oo|[Oo]verly|[Tt]hat){W}[Mm]uch CAP("plusmuch");
+
+{W}[Bb]ad/{EW} WCAP("ungood");
+{W}[Pp]oor/{EW} WCAP("ungood");
+{W}[Ll]ame/{EW} WCAP("ungood");
+{W}[Pp]itiful/{EW} WCAP("ungood");
+{W}[Nn]asty/{EW} WCAP("plusungood");
+{W}[Hh]orrid/{EW} WCAP("doubleplus ungood");
+{W}[Hh]orrible/{EW} WCAP("doubleplus ungood");
+{W}[Aa]wful/{W} WCAP("doubleplus ungood");
+{W}[Ee]vil/{W} WCAP("doubleplus ungood");
+
+%{
+ /******************************
+ * Titles *
+ ******************************/
+%}
+
+{W}[Ss]ir/{EW} WCAP("citizen");
+{W}[Mm]r"."/{EW} WCAP("brother");
+[Mm]ister/{EW} CAP("brother");
+[Mm]adame? CAP("sister");
+{W}[Mm]iss/{EW} WCAP("sister");
+[Mm]a"'"?am/{EW} CAP("sister");
+{W}[Mm]r?s"."/{EW} WCAP("sister");
+Mrs/{EW} CAP("sister");
+
+{YOUNG}?[Cc]hildren CAP("young citizens");
+{YOUNG}?[Bb]oys{ANDOR}[Gg]irl/s CAP("young citizens");
+{YOUNG}?([Kk]id|[Gg]irl|[Bb]oy|[Cc]hild)/{EW} CAP("young citizen");
+
+[Ff]ellow CAP("citizen");
+
+[Nn]on{W}?"-"?citizen CAP("unperson");
+[Nn]on{W}?"-"?member CAP("unperson");
+[Cc]riminal/s? CAP("unperson");
+{DEAD}(man|woman) CAP("unperson");
+{DEAD}(men|women) CAP("unpersons");
+
+[Ii]n{W}[Pp]erson DUMP();
+
+{W}[Uu]ser WCOMP("party ","worker");
+[Ss]tudent COMP("party ","worker");
+[Cc]itizen/s?{EW} COMP("party ","worker");
+[Pp]erson/s?{EW} COMP("party ","worker");
+[Pp]eople COMP("party ","workers");
+
+[Ss]enator |
+[Cc]ongressman |
+[Ss]upervisor |
+[Pp]rofessor printf("Inner Party Member");
+[Pp]rof"."/{EW} printf("Inner Party Member");
+[Pp]rof/{EW} printf("Inner Party Member");
+
+Representative/s? printf("Inner Party Member");
+representatives printf("Inner Party Members");
+
+[Ww]hite{W}[Cc]ollar |
+[Uu]pper{W}[Cc]lass COMP("inner ","party");
+[Mm]iddle{W}[Cc]lass CAP("party");
+[Bb]lue{W}[Cc]ollar |
+[Ww]orking{W}[Cc]lass |
+[Ll]ower{W}[Cc]lass CAP("prole");
+([Ff]ool|[Ii]diot)/s?{EW} CAP("prole");
+[Ss]tupidity CAP("proleness");
+
+%{
+ /******************************
+ * Organizations *
+ ******************************/
+%}
+
+[Aa]?{W}([Ww]hite{W}[Hh]ouse|[Gg]ovt\.?|[Gg]overnment){W}([Ss]ource|[Oo]fficial|[Ss]pokes(man|woman|person)) CAP("an Inner Party Member");
+{THE}?[Rr]epublican{W}[Pp]arty COMP("mini","luv");
+{THE}?[Dd]emocratic{W}[Pp]arty COMP("mini","plenty");
+
+{THE}?Congress printf("MiniPax");
+{THE}?[Ss]enate printf("MiniPax");
+{THE}?[Hh]ouse{W}[Oo]f{W}[Rr]epresentatives printf("MiniPax");
+{THE}?[Ss]tate{W}[Dd]epartment printf("MiniPax");
+{THE}?[Ss]tate{W}[Dd]ept"."? printf("MiniPax");
+{THE}?[Dd]efen[cs]e{W}[Dd]epartment |
+{THE}?[Dd]efen[cs]e{W}[Dd]ept"."? |
+{THE}?[Ww]ar{W}[Dd]epartment |
+{THE}?[Ww]ar{W}[Dd]ept"."? |
+{THE}?[Hh]ouse{W}of{W}[Cc]ommons |
+{THE}?Pentagon |
+{THE}?[Ff]eds |
+{THE}?FCC |
+{THE}?D[Oo]D |
+{THE}"D."[Oo]".D." |
+{THE}?[Ss]ecret{W}[Ss]ervice COMP("mini","luv");
+{THE}?White{W}House |
+{THE}?Kremlin printf("MiniTrue");
+{THE}?(CIA|NSA|FBI|MI"-"?5)/{EW} printf("MiniTrue");
+{THE}?("C.I.A."|"N.S.A."|"F.B.I.")/{EW} printf("MiniTrue");
+{THE}?[Aa]rchive/s? COMP("mini","rec");
+{THE}?[Ll]ibrary COMP("mini","rec");
+{THE}?[Ll]ibraries COMP("mini","recs");
+
+[Tt]hought{W}[Pp]olice|[Nn]azis? COMP("think","pol");
+[Vv]ice{W}[Ss]quad COMP("sex","pol");
+PMRC|"P.M.R.C." COMP("sex","pol");
+
+[Oo]fficer CAP("minister");
+
+{THE}?[Dd]epartment{EW}of{EW}. |
+{THE}?[Dd]ept"."?{EW}of{EW}. |
+{THE}?[Uu]niversity{EW}of{EW}. |
+{THE}?[Uu]niv"."?{EW}of{EW}. |
+{THE}?[Dd]ept"."?{EW}of{EW}. |
+{THE}?([Ss]ub"-"?)?[Cc]omm?itt?ee{EW}(of|on){EW}. |
+{THE}?[Ss]chool{EW}of{EW}. {
+ if ((yytext[yyleng-1] >= 'A') && (yytext[yyleng-1] <= 'Z'))
+ /* "the school of Law" --> "MiniLaw" */
+ printf("Mini%c",yytext[yyleng-1]);
+ else if ((yytext[yyleng-1] >= 'a') && (yytext[yyleng-1] <= 'z'))
+ /* "the school of law" --> "MiniLaw" (not "Minilaw") */
+ printf("Mini%c",yytext[yyleng-1] - ('a' - 'A'));
+ /* "the school of 5 things" --> "Ministry of 5 things" */
+ else printf("Ministry of %c",yytext[yyleng-1]);
+ }
+
+[Dd]epartment |
+[Uu]niversity CAP("ministry");
+[Uu]niv"."?/{W} CAP("ministry");
+[Dd]ept"."?/{W} CAP("ministry");
+([Ss]ub"-"?)?[Cc]omm?itt?ee CAP("ministry");
+
+{THE}[Pp]roject/{EW} CAP("the Three Year Plan");
+[Oo]ur{W}[Pp]roject/{EW} CAP("our Three Year Plan");
+[Bb]udget printf("Three Year Plan");
+[Pp]roject/{ES} printf("Three Year Plan");
+
+{W}({THE}|([aa]{W}))[Pp]roject printf("%cthe Three Year Plan",Y0);
+
+[A-Za-z]+"'"[Ss]/{W}(law|Law|LAW|book|Book|BOOK|rule|Rule|RULE){EW} printf("Goldstein's");
+
+%{
+ /******************************
+ * Actions *
+ ******************************/
+%}
+
+[Ii]n{W}love{EW} CAP("SexCriming");
+[Ll]ove{W}you/{EW} CAP("love Big Brother");
+[Ll]ove{W}me/{EW} CAP("love Big Brother");
+
+[Cc]loning |
+[Rr]eproduction |
+[Cc]elibacy |
+[Pp]rocreation COMP("good","sex");
+
+[Cc]elibate |
+[Pp]rocreate COMP("good","sexwise");
+
+[Tt]elevisions? |
+TVs? |
+[Tt]"."[Vv]"."s? |
+[Rr]adios? |
+[Nn]ews{W}?[Pp]apers? |
+[Jj]ournalism |
+[Mm]ovies? |
+[Rr]ock{EW}?"-"?(and|"&"|"'"?n"'"?){EW}?"-"?[Rr]oll({W}[Mm]usic)? |
+(([Rr]ock|[Cc]lassical|[Ii]ndustrial|[Pp]op|[Dd]ance|[Rr]ap){W})?[Mm]usic |
+[Tt]unes |
+[Mm]oney |
+[Cc]ash |
+[Cc]omic{W}[Bb]ooks? |
+([Ss]tar{W}?)?[Tt]rek COMP("prole","feed");
+
+[Pp]eace{W}[Mm]ovement |
+[Pp]eace{W}[Pp]rotest |
+[Aa]nti{EW}[Ww]ar |
+([Pp]assive{W})?[Rr]esistance |
+[Cc]reativity |
+[Tt]reason |
+[Rr]esearch COMP("crime","think");
+%{
+ /******************************
+ * Religion *
+ ******************************/
+%}
+
+[Jj]esus{W}[Cc]hrist |
+[Jj]esus |
+{THE}?[Bb]uddh?a |
+[Mm]ohamm?ed |
+[Mm]artin{W}[Ll]uther{W}[Kk]ing |
+J\.?\ ?R\.?\ \"?Bob\"?\ Dobbs printf("doubleplus crimethinker");
+
+([Jj]esse{W})?[Hh]elms |
+([RrDd]on(ald)?{W})?[Rr]ea?gan |
+[Gg]eorge{W}[Gg]uscoria printf("doubleplus goodthinker");
+
+[Jj]ewish COMP("crime","thinkwise");
+[Jj]ew |
+[Cc]hristian |
+[Mm]oslem |
+[Bb]uddhist |
+[Aa]thiest |
+[Aa]gnostic COMP("crime","thinker");
+
+[Ff]aith COMP("belly","feel");
+
+%{
+ /******************************
+ * Places *
+ ******************************/
+%}
+
+[Ee]ngland|{THE}?[Uu]nited{W}[Kk]ingdom |
+({THE}?[Uu]nited{W}[Ss]tates{W}[Oo]f{W})?[Aa]merica |
+{THE}?[Uu]nited{W}[Ss]tates|USA|"U.S.A."|[Cc]anada |
+[Gg]ermany|[Ii]srael|[Ee]urope printf("Oceana");
+
+Iranian|Iraqu?i|Libyan|Russian|African|Egyptian printf("Eurasian");
+Iran|Iraq|Libya|Russia|Africa|Egypt |
+([Ss]audi{W})?Arabia|{THE}?Soviet{W}Union printf("Eurasia");
+[Ss]oviet printf("Eurasian");
+
+[Cc]hinese|[Jj]apanese|[Tt]aiwanese |
+[Pp]hillipino|[Ii]ndian|[Aa]ustralian|[Mm]exican |
+[Nn]icaraguan|[Ss]alvadori?an printf("Eastasian");
+China|[Jj]apan|[Tt]aiwan|{THE}?[Pp]hillipines|[Ii]ndia |
+[Aa]ustralia|[Mm]exico|[Nn]icaragua|[Ee]l{W}[Ss]alvador printf("Eastasia");
+
+[Kk]uwaiti printf("Eurasian");
+[Kk]uwait printf("The Malabar Front");
+
+%{
+ /******************************
+ * Miscelaneous Translations *
+ ******************************/
+%}
+
+{W}[Ff]aster WCAP("plus speedful");
+{W}[Ss]lower WCAP("plus unspeedful");
+{W}[Ff]ast WCAP("speedful");
+{W}[Ss]low WCAP("unspeedful");
+
+[Mm]odern CAP("plusnew");
+[Aa]ncient CAP("plusunnew");
+{W}old/{W} WCAP("plusunnew");
+
+[Hh]appiness CAP("joyfulness");
+[Hh]appy CAP("joyful");
+[Qq]uick CAP("speedful");
+{W}[Ss]peedy WCAP("speedful");
+[Hh]eavy CAP("weightful");
+[Hh]eavill?y CAP("weightfully");
+[Ss]ick(ly)? CAP("unhealthful");
+
+[Gg]ross |
+[Ss]ickening |
+[Ff]oul |
+[Pp]utrid |
+[Dd]isgusting COMP("crime","thinkful");
+
+[Ss]mash |
+[Cc]rush |
+[Oo]bliterate |
+[Aa]nnihilate |
+[Nn]eutralize |
+[Dd]emolish |
+[Dd]estroy CAP("unbuild");
+
+[Ii]nanimate CAP("unlifeful");
+[Ss]ociety|[Cc]ulture printf("IngSoc");
+[A-Za-z]+isi?m/{EW} printf("Goldsteinism");
+[A-Za-z]+ist/{EW} printf("Goldsteinist");
+
+{W}[Dd]ead WCAP("unlifeful");
+{W}[Dd]eath WCAP("unlife");
+{W}[Ll]ie WCAP("untruth");
+{W}[Ff]alsehood WCAP("untruth");
+{W}[Mm]istake/{EW} WCAP("untruth");
+{W}[Ww]hisper WCAP("unshout");
+{W}[Pp]roud WCAP("prideful");
+
+[Ff]alse CAP("untrue");
+[Dd]ark CAP("unlight");
+[Bb]lack CAP("unwhite");
+[Ff]orbidden CAP("unallowed");
+[Ff]orbid CAP("unallow");
+[Ff]ailure CAP("unsuccess");
+[Ff]ail/{EW} CAP("unwin");
+
+[Ss]tatistics?/{EW} CAP("propaganda");
+{W}[Aa]n{W}[Aa]nn?ouncement WCAP("a NewsFlash");
+[Aa]nn?ouncement printf("NewsFlash");
+[Ii]nstructions? printf("B. B. DayOrder");
+
+[Aa]lmost|[Nn]early CAP("within measurable distance of");
+[Ff]unny CAP("humorful");
+
+[Dd]oom CAP("unsave");
+[Cc]haos CAP("unorder");
+[Cc]haotic CAP("unorderful");
+[Ee]nslaved CAP("protected");
+[Ee]nslave CAP("protect");
+[Dd]angerous CAP("unsafewise");
+[Dd]anger CAP("unsafe");
+([Bb]lind{W})?[Oo]bedience COMP("ing","soc");
+\"?[Nn]ew{W}[Ww]orld{W}[Oo]rder\"? printf("IngSoc");
+
+[Pp]rivacy |
+[Ii]ndividuality COMP("own","life");
+
+IMHO printf("for the love of Big Brother");
+
+[Ee]motion(al|s)? |
+[Cc]onviction |
+[Bb]elie(f|ve) |
+[Aa]ccept(ance)? COMP("belly","feel");
+
+[Dd]emocracy |
+[Ll]iberty |
+[Ff]reedom |
+[Jj]ustice |
+{THE}?[Aa]merican{W}[Ww]ay |
+[Ss]ubversion |
+[Pp]assion COMP("crime","think");
+
+[Oo]bscenity |
+[Pp]ornography |
+[Oo]rgasm |
+[Ee]rotica COMP("sex","crime");
+[Ss]exy |
+[Oo]bscene |
+[Pp]ornographic |
+[Ee]rotic COMP("sex","crimeful");
+
+[Cc]ritic/s?{W} COMP("crime","thinker");
+
+[Ii]nfant{W}[Mm]ortality COMP("inf","mort");
+
+[Ff]amilies |
+[Pp]arents COMP("family ","units");
+[Mm]other{ANDOR}[Ff]ather |
+[Bb]rother{ANDOR}[Ss]ister COMP("family ","unit");
+{W}[Pp]arent/s?{EW} WCOMP("family ","unit");
+[Ff]amily COMP("family ","unit");
+
+God/{EW} printf("Big Brother");
+[Pp]res(ident|".")({W}([Bb]ush|[Rr]eagan))? printf("Big Brother");
+[Pp]rime{W}[Mm]inister printf("Big Brother");
+
+([Gg][Nn][Uu]{W}([Ee]macs|EMACS){W})?[Gg]eneral{W}[Pp]ublic{W}[Ll]icense printf("NewSpeak Dictionary");
+
+(questioning|murder|ass?ass?ination)/{ES} printf("interrogation");
+
+[Ss]keptic/{EW} CAP("unperson");
+[Ss]illy CAP("foolhardy");
+{W}[A-Za-z][A-Za-z]?illy DUMP();
+[Ss]outhern|[Ss]outherly CAP("southwise");
+[Nn]orthern|[Nn]ortherly CAP("northwise");
+[Ee]astern|[Ee]easterly CAP("eastwise");
+[Ww]estern|[Ww]esterly CAP("westwise");
+[Pl]leasant CAP("goodwise");
+[Vv]iolent CAP("unpeacewise");
+[Vv]iolence CAP("unpeaceness");
+[Ii]ndifference CAP("uncarefulness");
+[Ii]ndifferent CAP("uncareful");
+[Bb]elly CAP("abdomen");
+[Cc]omic CAP("humorwise");
+{W}[Uu]nless WCAP("lest");
+usually printf("usualwise");
+
+[Gg]uerillas COMP("party ","workers");
+
+[Ww]ar/{EW} CAP("engagement");
+[Dd]efen[cs]e/{EW} CAP("peace");
+[Ii]nvasion CAP("liberation");
+
+%{
+ /******************************
+ * Syllable Rewriting *
+ ******************************
+ isn't ___ is un___
+ not the ___ the un___
+ not my ___ my un___
+ anti___ un___ (etc...)
+ ___cally ___wise
+ ___ally ___wise
+ ___lly ___wise
+ ___ly ___wise
+ ___aic ___wise
+ ___lic ___wise
+ ___nnic ___wise
+ <VOWEL>tric ___wise
+ ___ic ___wise
+ <VOWEL>ous ___ful
+ <CONSONANT>ous ___eful
+ ___less un___ful
+
+ */
+%}
+
+[Ii]sn"'"t{W}my{W} CAP("is my un");
+[Ii]s{W}not{W}my{W} CAP("is my un");
+[Ii]sn"'"t{W}[Tt]he{W} CAP("is the un");
+[Ii]s{W}not{W}[Tt]he{W} CAP("is the un");
+[Ii]sn"'"t{W}[Ii]n{W}[Tt]he{W} CAP("is in the un");
+[Ii]s{W}not{W}[Ii]n{W}[Tt]he{W} CAP("is in the un");
+[Ii]t"'"?s{W}not{W}[Tt]he{W} CAP("it's the un");
+[Ii]sn"'"t{W} CAP("is un");
+[Ii]s{W}not{W} CAP("is un");
+[Nn]ot{W}[Tt]he{W} CAP("the un");
+[Nn]ot{W}[Mm]y{W} CAP("my un");
+[Nn]ot{W}[Aa]{W} CAP("an un");
+[Nn]ot{W}have{W} CAP("has un");
+[Nn]ot{W}be{W} CAP("be un");
+[Nn]ot{W}[Oo]nly/{W} CAP("unonly"); /* avoid "unonwise" */
+
+[Aa]{W}[Nn]ot{W} |
+[Aa]{W}[Nn]on"-"? printf("%cn%cun",Y0,Y1); /* "a non_" -> "an un_" */
+
+%{
+/* {W}[Nn]ot{W} | */
+%}
+{W}[Ii]l"-"?/[a-z][a-z] WCAP("un");
+{W}[Aa]nti"-"? |
+{W}[Nn]on"-"? WCAP("un");
+
+robably|ventually|[Oo]bvious|[Bb]asic|{W}[Oo]nly|otally |
+[Aa]rctic|holic|{EW}ally|{EW}[Aa]pply|{W}[Tt]opic DUMP();
+
+{W}([Tt]raf|[Pp]aci|[Ss]peci)fi/c{W} DUMP();
+{W}(ma|tra)gi/c{W} DUMP();
+{W}(pub|cyc|re|fro|gar)li/c{W} DUMP();
+{W}(eth|cli|to)ni/c{W} DUMP();
+{W}(E|cle|met|cit)ri/c{W} DUMP();
+{W}(ch|ep|tr?op|t|mus|stat|att)i/c{W} DUMP();
+{W}only/{W} DUMP();
+{W}[Aa]tlantic DUMP();
+
+[ \t\n][drstwDRSTW]ally printf("%c%cally", Y0, Y1);
+
+[a-z]ically/{W} printf("%cwise", Y0);
+[a-z]ally/{W} printf("%cwise", Y0);
+[a-z][a-z]lly/{W} printf("%c%cwise", Y0,Y1);
+[a-z][a-z][a-z]ly/{W} printf("%c%c%cwise", Y0,Y1,Y2);
+[a-z]ical/{W} printf("%cwise", Y0);
+
+[a-km-qs-z]aic/{EW} printf("%cwise", Y0); /* not laic, raic */
+[a-z]lic/{EW} printf("%clwise", Y0);
+[a-z]nnic/{EW} printf("%cnwise", Y0);
+[a-z][aeiou]tric/{EW} printf("%c%ctwise", Y0, Y1);
+[a-z]tric/{EW} printf("%cwise", Y0);
+[a-z]ic/{EW} printf("%cwise", Y0);
+[a-z]lly/{EW} printf("%cwise", Y0);
+[a-z]ly/{EW} printf("%cwise", Y0);
+
+[aeiouy][^aeiouy]ous/{EW} printf("%c%cful",Y0,Y1);
+[^aeiouy]ous/{EW} printf("%ceful",Y0);
+[^e]ous/{EW} printf("%cful",Y0);
+
+[A-Za-z]+less/{EW} { yytext[yyleng-4] = '\0';
+ if (((yytext[1] < 'A') || (yytext[1] > 'Z')) &&
+ (yytext[0] >= 'A') && (yytext[0] <= 'Z'))
+ yytext[0] = yytext[0] - ('a' - 'A');
+ printf("%cn%sful",C('u'), yytext);
+ }
+
+". " { printf("%s",yytext);
+ fcounter &= 15;
+ if (14 == fcounter++) printf("(fnord) ");
+ }
+
+[.,!?]\"([^\n\".!]+[.!])?\n/[\n\t ] printf("%c Hail Big Brother!\"%s",Y0,yytext+2);
+\"([.,!?][^\n\".!]+[.!])?\n/[\n\t ] printf("%c Hail Big Brother!\"%s",Y1,yytext+2);
+
+. printf("%s", yytext);
+\n printf("\n");
+
+%{
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Brief description of Orwell's NewSpeak:
+ * ---------------------------------------
+ * Each word was made to serve as noun, verb, adjective and adverb. In
+ * particular, nouns and verbs were made exactly the same -- hence "think"
+ * replaced "thought" as a noun (viz. "crimethink" = thought crime, "thinkpol"
+ * = thought police). Adjectives were formed by adding "-ful" to a noun/verb;
+ * adverbs were formed by adding "-wise." Hence "speedful" = fast,
+ * "speedwise" = quickly, "unspeedwise" = slowly.
+ *
+ * The decision on which word should be negated was made fairly randomly;
+ * "dark" could be "unlight," or "light" could be "undark". But in all cases
+ * the most important objective (aside from ideological restriction) was
+ * euphony; the words had to be easily pronounceable.
+ *
+ * Most verb inflections were made regular; "he thinked," "he goed," "he
+ * eated"; only the auxiliaries and modals (to be, to have, may, shall, will,
+ * etc.) were allowed to inflect irregularly. Plurals were also regularized:
+ * "mans," "oxes," "childs." [This isn't implemented here.]
+ *
+ * There were three sets of words. The A vocabulary was for everyday use:
+ * car, man, red, good, etc. It was restricted to fairly simple words.
+ *
+ * The B vocabulary consisted of political/ideological words with very
+ * complicated connotations. All of the B words were compound words --
+ * bellyfeel (blind emotional acceptance of the ideology), oldthink (the way
+ * of thought before the Revolution), crimethink, Ingsoc, goodsex (intercourse
+ * solely for the purpose of making babies and with no physical enjoyment on
+ * the part of the female), sexcrime (any kind of sex but goodsex, including
+ * sex for its own sake), goodthink (thinking in accordance with Ingsoc), and
+ * so on. These words were also subject to the modifications mentioned
+ * above--hence "goodthinker," "goodthinkful," "goodthinkwise."
+ *
+ * The C vocabulary consisted of scientific and technical words (though there
+ * was no longer any word for "science," any connotation it might have being
+ * subsumed into "Ingsoc").
+ *
+ * Implementing a translator for all of this would be really complicated --
+ * I'd need rather extensive lists of the "irregular" words (so they could be
+ * regularized), as well as lists of politically meaningful words (so they
+ * could be excised or translated into either "goodthink" or "crimethink," as
+ * appropriate). Any kind of sexual topic should become "sexcrime" (it being
+ * unlikely that any talk of sex these days would fit into "goodsex").
+ *
+ * Basically, the reason it's hard is that NewSpeak was intended to *decrease*
+ * the vocabulary, and subsume complicated ideas into politically correct
+ * words so that you wouldn't have to understand the ideas anymore; you'd just
+ * have to emit the right words. So to properly "translate" anything into
+ * NewSpeak, you have to cut the vocabulary way down.
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ */
+%}
+
+%%
+main()
+{
+ yylex();
+ printf("\nHail Big Brother!\n");
+}
+
+
+capstring(firstchar,string,i)
+ char firstchar, *string;
+ int i;
+{
+ if (firstchar != 0) putchar(firstchar);
+ putchar( (yytext[i] <= 'Z') ? (string[0] - ' ') : string[0]);
+ printf("%s",string+1);
+}
+
+compstring(firstchar,string1,string2,i)
+ char firstchar, *string1, *string2;
+ int i;
+{
+ capstring(firstchar,string1,i);
+ capstring(0,string2,i);
+}
+
+_caseify(c,i)
+ char c;
+ int i;
+{
+ if (yytext[i] <= 'Z') return (c - ' ');
+ else return (c);
+}
+
+caseify(c)
+ char c;
+{ _caseify(c,0); }
+
+caseify1(c)
+ char c;
+{ _caseify(c,1); }
--- /dev/null
+%{
+/*
+ * Lex filter to transform plain English into Brooklyn English.
+ * No racial or societal slurs are intended. For amusement only.
+ *
+ * Copyright 1986 by Daniel Klein.
+ *
+ * Reproduction permitted so long as this notice is retained.
+ */
+%}
+BW [ \t]
+SP [ \t]
+EW [ \t.,;!\?$]
+%%
+%{
+ void plastc() {
+ yyunput(yytext[yyleng-1], yytext);
+ }
+%}
+".so ".*$ printf("%s", yytext);
+[ao]ther printf("%cdder", yytext[0]=='a'?'a':'u');
+[Nn]othing printf("%cuttin'", yytext[0]);
+[Tt]hin printf("%cin", yytext[0]);
+[Tt]hir printf("%coi", yytext[0]);
+[Tt]h[ei] printf("%c%c", caseify('d'), yytext[yyleng-1]);
+[Tt]hat printf("%cat", caseify('d'));
+I'm{SP}going{SP}to printf("I'manna");
+going{SP}to printf("gonna");
+want{SP}to printf("wanna");
+t{SP}you printf("tcha");
+[Dd]id{SP}you{SP}[eaiou] printf("%c'j%c", yytext[0], yytext[yyleng-1]);
+[Dd]id{SP}you printf("%c'ja", yytext[0]);
+[Yy]ou printf("%cuh", yytext[0]);
+[Hh]ow{SP}are{SP}you printf("%cowahrya", yytext[0]);
+[Ww]ith printf("%cit'", yytext[0]);
+[Dd]on't printf("%coan", yytext[0]);
+ldn't |
+dn't printf("n't");
+isn't printf("ain't");
+er{EW} { printf("uh"); plastc(); }
+ing{EW} { printf("in'"); plastc(); }
+[Ww]ord |
+[Hh]eard |
+[BbGgLlPpSs]urg |
+[CcHh][eu]r[ntv] printf("%coi%c", yytext[0], yytext[yyleng-1]);
+[^Mm]mer[^aeiouhrs] printf("%cmoi%c", yytext[0], yytext[yyleng-1]);
+[Oo]re{EW} { printf("%cwh", caseify('a')); plastc(); }
+[Oo]r printf("%cwh", caseify('a'));
+[Oo]f printf("%chv", caseify('u'));
+tion printf("shun");
+alk |
+our[st] |
+or[st] printf("awh%c", yytext[yyleng-1]);
+ause printf("awze");
+[Oo]ff printf("%cwhf", caseify('a'));
+[Ss]tupid printf("%ctoopid", yytext[0]);
+{BW}under printf(" unner");
+{BW}to{EW} { printf(" tuh"); plastc(); }
+[Aa]ctual printf("%cckshul", yytext[0]);
+negro printf("spade");
+[Pp]uerto{SP}[Rr]ican printf("%cpic", caseify('s'));
+[Ii]talian printf("%creaser", caseify('g'));
+[Jj]ewish printf("%cew boy", yytext[0]);
+[Jj]ew printf("%cebe", caseify('h'));
+[a-z]":" { *(yytext+1) = ',';
+ printf("%s like, uhh:",yytext);
+ }
+[a-z]"?" { *(yytext+1) = ',';
+ printf("%s or what?",yytext);
+ }
+! printf("! Okay?");
+[a-z]"." { printf("%s", yytext);expletive();}
+%%
+
+caseify(c)
+char c;
+{
+ if (yytext[0] <= 'Z')
+ return (c - ' ');
+ else
+ return (c);
+}
+
+short count = 0;
+short which = 0;
+
+expletive()
+{
+ if (count++ % 4 == 0) {
+ switch (which++ % 5) {
+ case 0: printf(" Okay?"); break;
+ case 1: printf(" Right?"); break;
+ case 2: printf(" Yuh got me so fahr?"); break;
+ case 3: printf(" Ya' dig?"); break;
+ case 4: printf(" Yuh with me?"); break;
+ }
+ }
+}
+
+main()
+{
+ yylex();
+}
+
+int yywrap()
+{
+ return 1;
+}
--- /dev/null
+#!/usr/bin/perl -p
+
+# an array, not a hash. because order is important
+@trans_table=(
+ '\bmy\b' => 'me',
+ '\bboss\b' => 'admiral',
+ '\bmanager\b' => 'admiral',
+ '\b[Cc]aptain\b' => "Cap'n",
+ '\bmyself\b' => 'meself',
+ '\byour\b' => 'yer',
+ '\byou\b' => 'ye',
+ '\bfriend\b' => 'matey',
+ '\bfriends\b' => 'maties',
+ '\bco[-]?worker\b' => 'shipmate',
+ '\bco[-]?workers\b' => 'shipmates',
+ '\bearlier\b' => 'afore',
+ '\bold\b' => 'auld',
+ '\bthe\b' => "th'",
+ '\bof\b' => "o'",
+ '\bdon\'t\b' => "dern't",
+ '\bdo not\b' => "dern't",
+ '\bnever\b' => "no nay ne'er",
+ '\bever\b' => "e'er",
+ '\bover\b' => "o'er",
+ '\bYes\b' => 'Aye',
+ '\bNo\b' => 'Nay',
+ '\bdon\'t know\b' => "dinna",
+ '\bhadn\'t\b' => "ha'nae",
+ '\bdidn\'t\b' => "di'nae",
+ '\bwasn\'t\b' => "weren't",
+ '\bhaven\'t\b' => "ha'nae",
+ '\bfor\b' => 'fer',
+ '\bbetween\b' => 'betwixt',
+ '\baround\b' => "aroun'",
+ '\bto\b' => "t'",
+ '\bit\'s\b' => "'tis",
+ '\bIt\'s\b' => 'It be',
+ '\bwoman\b' => 'wench',
+ '\blady\b' => 'wench',
+ '\bwife\b' => 'lady',
+ '\bgirl\b' => 'lass',
+ '\bgirls\b' => 'lassies',
+ '\bguy\b' => 'lubber',
+ '\bman\b' => 'lubber',
+ '\bfellow\b' => 'lubber',
+ '\bdude\b' => 'lubber',
+ '\bboy\b' => 'lad',
+ '\bboys\b' => 'laddies',
+ '\bchildren\b' => 'minnows',
+ '\bkids\b' => 'minnows',
+ '\bhim\b' => 'that scurvey dog',
+ '\bher\b' => 'that comely wench',
+ '\bhim\.\b' => 'that drunken sailor',
+ '\bHe\b' => 'The ornery cuss',
+ '\bShe\b' => 'The winsome lass',
+ '\bhe\'s\b' => 'he be',
+ '\bshe\'s\b' => 'she be',
+ '\bwas\b' => "were bein'",
+ '\bHey\b' => 'Avast',
+ '\bher\.\b' => 'that lovely lass',
+ '\bfood\b' => 'chow',
+ '\broad\b' => 'sea',
+ '\broads\b' => 'seas',
+ '\bstreet\b' => 'river',
+ '\bstreets\b' => 'rivers',
+ '\bhighway\b' => 'ocean',
+ '\bhighways\b' => 'oceans',
+ '\bcar\b' => 'boat',
+ '\bcars\b' => 'boats',
+ '\btruck\b' => 'schooner',
+ '\btrucks\b' => 'schooners',
+ '\bSUV\b' => 'ship',
+ '\bmachine\b' => 'contraption',
+ '\bairplane\b' => 'flying machine',
+ '\bjet\b' => 'flying machine',
+ '\bdriving\b' => 'sailing',
+ '\bdrive\b' => 'sail',
+ '\bwith\b' => "wi'",
+ '\bam\b' => 'be',
+ '\bis\b' => 'be',
+ '\bare\b' => 'be',
+ '\bwas\b' => 'be',
+ '\bwere\b' => 'be',
+ '\bwere\b' => 'be',
+);
+
+while (@trans_table) {
+ $key=shift @trans_table;
+ $value=shift @trans_table;
+ s/$key/$value/g;
+}
+
+s/ing\b/in'/g;
+s/ings\b/in's/g;
+s/(\.( |\t|$))/avast($1,3)/eg;
+s/([!\?]( \t|$))/avast($1,2)/eg; # Greater chance after exclamation
+s/\Br\B/roll()/eg;
+
+sub roll {
+ return 'r' x (rand(5)+1) if rand > 0.5;
+ return 'r';
+}
+
+sub avast {
+ my $stub=shift;
+ my $chance=shift;
+
+ my @shouts=(
+ ", avast$stub",
+ "$stub Ahoy!",
+ ", and a bottle of rum!",
+ ", by Blackbeard's sword$stub",
+ ", by Davy Jones' locker$stub",
+ "$stub Walk the plank!",
+ "$stub Aarrr!",
+ "$stub Yaaarrrrr!",
+ ", pass the grog!",
+ ", and dinna spare the whip!",
+ ", with a chest full of booty$stub",
+ ", and a bucket o' chum$stub",
+ ", we'll keel-haul ye!",
+ "$stub Shiver me timbers!",
+ "$stub And hoist the mainsail!",
+ "$stub And swab the deck!",
+ ", ye scurvey dog$stub",
+ "$stub Fire the cannons!",
+ ", to be sure$stub",
+ ", I'll warrant ye$stub",
+ "$stub Arr, me hearty!",
+ );
+
+ if (int rand($chance) == 1) {
+ return @shouts[rand @shouts]." ";
+ }
+ else {
+ return $stub;
+ }
+}
--- /dev/null
+#!/usr/bin/perl
+
+$row = "!qwertyuiop!asdfghjkl!zxcvbnm!";
+@row_array = split(//, $row);
+
+while (<>) {
+ chomp;
+ y/A-Z/a-z/;
+ s/\byou\b/u/gi;
+ s/\bpeople\b/ppl/gi;
+ s/\bthrough\b/thru/gi;
+ s/\bthough\b/tho/gi;
+ s/\bnope\b/nup/gi;
+ s/\baustralia\b/oz/gi;
+ s/\bfilm\b/flim/gi;
+ s/\bsucks\b/sux/gi;
+ s/\benough\b/enuff/gi;
+ s/\ba lot\b/a shitload/gi;
+ s/\bstuff\b/shit/gi;
+ s/, /.. /g;
+ s/\.$/.../g;
+
+ @lets = split(//);
+
+ $strlen = $#lets;
+
+ for ($x = 0; $x < $strlen; $x++) {
+ if (rand() < 0.01) {
+ swap(\@lets, $x, $x + 1);
+ next;
+ }
+
+ if (rand() < 0.10 && $lets[$x] eq " ") {
+ swap(\@lets, $x - 1, $x - 2);
+ next;
+ }
+
+ if(rand() < 0.01) {
+ $i = insert_adjacent(\@lets, $x, $lets[$x]);
+ $strlen += $i;
+ next;
+ }
+
+ if(rand() < 0.01) {
+ splice(@lets, $x, 1);
+ $strlen--;
+ next;
+ }
+ }
+
+ print join("", @lets) . "\n";
+}
+
+sub insert_adjacent {
+ my($aref, $pos, $let) = @_;
+
+
+ $newlet = get_adjacent($let);
+
+ if( !$newlet ) {
+ return 0;
+ }
+
+ splice(@$aref, $pos + 1, 0, $newlet);
+ return 1;
+}
+
+
+sub get_adjacent {
+ my($let) = @_;
+
+ return 0 if $let !~ /[a-zA-Z]/;
+
+ $i = index($row, $let);
+ $before = $row_array[$i - 1];
+ $after = $row_array[$i + 1];
+
+
+
+ if( $before eq "!" || (rand() < rand() && $after ne "!")) {
+ return $after;
+ } else {
+ return $before;
+ }
+}
+
+sub swap {
+ my($aref, $n, $m) = @_;
+ my($tmp);
+
+ if(defined($$aref[$n]) && defined($$aref[$m])) {
+ if(! (($$aref[$n] =~ /[A-Z ]/ && $$aref[$m] =~ /[A-Z ]/) ||
+ ($$aref[$n] =~ /[a-z ]/ && $$aref[$m] =~ /[a-z ]/) )) {
+ return;
+ }
+ $tmp = $$aref[$n];
+ $$aref[$n] = $$aref[$m];
+ $$aref[$m] = $tmp;
+ }
+}
+
--- /dev/null
+#!/usr/bin/perl -w
+# Fake scottish (dwarven) accent filter, by Adam Borowski, inspired by the
+# character "Durkon" from Order of the Stick by Rich Burlew. GPL, 2007.
+use strict;
+
+my @repl=qw(
+ ^yes$:aye there:thar eir$:ar
+ about:aboot ^he$:'e them:'em
+ ^him:'im out_of$:outta of_course:'course
+ ^of$:o' ^and$:an' to$:ta
+ tog:tag that:tha the:tha
+ wouldn't:wouldn'ta cannot:cannae can't:cannae
+ don't:dinnae 're$:r for$:fer
+ ver$:'er ber$:b'r every$:ev'ry
+ en$:'n ^if$:if'n enl:'nl
+ eng:'ng ing:in' ment:mn't
+ ^es:'s ^ex:'s ^not$:na
+ ^no$:nay n't_have:n'tve ^is$:be
+ ^are$:be have:haf abl:'bl
+ ^you$:ye ^your:yer ^you':ye'
+ noth:nuth ^this$:'tis ^here:'ere
+ doesn't:don't at_a$:atta ith$:it'
+ ered$:'red into$:inta ^before:'fore
+ wit'_':wit_' wit'_t:wit_t wit'_w:wit_w
+ wit'_y:wit_y get_a:git_a ally$:'lly
+ ^my:me ^i_think$:methinks nay_w:na_w
+ ^one$:'un ^'un_a:one_a at_ta$:atta
+ ot_ta$:otta ^isn't$:ain't ^so_th:s'th
+ ned$:n'd ^because:'cause
+), my @r;
+
+sub firstu($) {
+ $_[0]=~s/^([^a-z]*)([a-z])/$1\u$2/;
+ return $_[0];
+}
+
+for(@repl) {
+ s/_/ /g;
+ my ($l,$r)=split(/:/,$_);
+ for([$l,$r], [firstu $l, firstu $r], ["\U$l","\U$r"]) {
+ ($l,$r)=@$_;
+ $l=~s/^\^/\\b/;
+ $l=~s/\$$/\\b/;
+ push @r, [qr/$l/, $r];
+ }
+}
+
+while(my $txt=<>) {
+ $txt=~s/$$_[0]/$$_[1]/g for @r;
+ print $txt;
+}
--- /dev/null
+../scramble: scramble.c
+ $(CC) -o $@ $< -O2 -g
+
+clean:
+ rm -f ../scramble
--- /dev/null
+/* Scramble the "inner" letters of each word in the input into a random order, and output the result. Non-word (that is, non-alphabetical) characters, and the first and last letters of each word, are left alone.
+ * Output to something other than stdout will append to the file instead of overwriting it - this may be undesirable, and can be changed if so.
+ */
+
+/* Copyright 2009-07-11 Andrew J. Buehler.
+ */
+
+/* This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <ctype.h> // for isalpha()
+#include <stdlib.h> // for malloc()/calloc()/realloc()/free() and rand()/srand()
+#include <string.h> // for strlen()
+#include <time.h> // for time()
+
+#define ALLOW_FILE_IO 0
+
+
+/* strips 'reduction' characters from the end of the input string and returns the result
+ * works only if strlen(string> >= reduction, which is the case in the only place it is presently called
+ */
+char *shorten_string(char *string, int reduction) {
+ int i;
+
+ i = strlen(string);
+
+ for (; reduction > 0; reduction--, i--) {
+ string[i-1] = '\0'; // would it work to use an 'i-reduction' approach instead, similar to what was later done in narrow_string()?
+ }
+
+ return string;
+}
+
+/* strips 'reduction' characters from the beginning and the end of the input string and returns the result
+ * works only if(strlen(string) >= 2*reduction), which is the case in the only place it is presently called
+ */
+char *narrow_string(char *string, int reduction) {
+ int i = reduction;
+
+ while(string[i]) {
+ string[i-reduction] = string[i];
+ i++;
+ }
+ string[i-reduction] = '\0';
+
+ return shorten_string(string, reduction);
+}
+
+int all_one_letter(char *string) {
+ char c;
+ int i;
+
+ c = string[0];
+ for(i = 1; string[i] != '\0'; i++) {
+ if(c != string[i]) {
+ return 0; // a nonduplicate letter has been found
+ }
+ c = string[i];
+ }
+
+ return 1; // reached the end of the string having found only duplicate letters, so it's all one letter
+}
+
+/* randomly reorders the contents of the string
+ * WARNING: frees the input string and returns a replacement
+ */
+char *scramble_string(char *string) {
+ char *ret, *tmpstr;
+ int len, i, j;
+
+ len = strlen(string);
+ if(len < 2) return string; // can't scramble a 1-character string or an empty string!
+ if(all_one_letter(string)) return(string); // can't scramble a string which consists entirely of one letter!
+
+ ret = strdup(string);
+
+ while(strcmp(string, ret) == 0) {
+ j = 0;
+ tmpstr = strdup(string);
+ while(len > 0) {
+ i = rand() % len;
+ ret[j] = tmpstr[i];
+ j++;
+ while(tmpstr[i] != '\0') {
+ tmpstr[i] = tmpstr[i+1];
+ i++;
+ }
+ len--;
+ }
+ free(tmpstr);
+ len = strlen(string);
+ }
+
+
+ free(string);
+ return ret;
+}
+
+char *clear_string(char *string) {
+ int i;
+
+ i = strlen(string);
+
+ for(; i >= 0 ; i--) {
+ string[i] = '\0';
+ }
+
+ return string;
+}
+
+int main(int argc, char **argv) {
+ int word_length;
+ char c, tempchar, *word;
+ FILE *infile, *outfile;
+
+#if ALLOW_FILE_IO
+ /* open files, if any other than stdin and stdout */
+ if(argc > 1) {
+ if(!strcmp(argv[1], "--help") ||
+ !strcmp(argv[1], "-h")) {
+ printf("Usage: %s [INPUT_FILENAME] [OUTPUT_FILENAME]\n", argv[0]);
+ printf("If INPUT_FILENAME is omitted or is '-', read from standard input\nIf OUTPUT_FILENAME is omitted or is '-', print to standard output\n");
+ return 0;
+ }
+
+ if(strcmp(argv[1], "-")) {
+ infile = fopen(argv[1], "r");
+ if(infile == NULL) {
+ fprintf(stderr, "Unable to open input file %s for reading\n", argv[1]);
+ return 1;
+ }
+ } else {
+ infile = stdin;
+ }
+
+ if(argc > 2) {
+ if(strcmp(argv[2], "-")) {
+ outfile = fopen(argv[2], "a");
+ if(outfile == NULL) {
+ fprintf(stderr, "Unable to open output file %s for writing\n", argv[2]);
+ return 2;
+ }
+ } else {
+ outfile = stdout;
+ }
+ }
+ } else { // no arguments specified
+ infile = stdin;
+ outfile = stdout;
+ }
+#else
+ infile = stdin;
+ outfile = stdout;
+#endif
+
+ srand(time(NULL)); // needed for scramble_string() to actually be random
+
+ word_length = 0;
+ word = malloc(sizeof(char));
+ word[0] = '\0';
+ c = fgetc(infile);
+
+ if(feof(infile)) {
+ printf("Reached EOF while reading the first character of the input file!\n");
+ return 4;
+ }
+
+ while(!feof(infile)) {
+ if(isalpha(c)) {
+ word = realloc(word, word_length+2); // one for the new character, one for the null
+ word[word_length] = c;
+ word[word_length + 1] = '\0'; // duplicate addition with the next line, but possibly more readable
+ word_length++;
+ } else {
+ if(word_length) {
+ word_length--;
+ fputc(word[0], outfile);
+ if(word_length) {
+ tempchar = word[word_length];
+ word = scramble_string(narrow_string(word, 1));
+ fprintf(outfile, "%s", word);
+ fputc(tempchar, outfile);
+ }
+ word = clear_string(word);
+ word_length = 0;
+ }
+ fputc(c, outfile);
+ }
+ fflush(outfile);
+ c = fgetc(infile);
+ }
+
+ free(word);
+ return 0;
+}
--- /dev/null
+#!/usr/bin/perl
+# Talk like a spammer. Copyright 2002 by Joey Hess <joeyh@debian.org>
+# Licensed under the GPL.
+#
+# Doesn't always generate proper engrish, but then neither do
+# spammers.
+
+sub c {
+ return $_[rand @_];
+}
+
+sub line_of_yelling {
+ my @lines=split(/\n/, shift);
+ my $n=rand @lines;
+ $lines[$n] = uc($lines[$n]);
+ return join("\n", @lines);
+}
+
+sub for_free {
+ return c(qw(100% completely totally absolutely))." ".c(qw(f F))."ree";
+}
+
+my $hits=0;
+
+if (rand > 0.75) {
+ $hits++;
+ $spam .= "Dear Friend, ";
+}
+elsif (rand > 0.9) {
+ $hits++;
+ $spam .= "Below is the result of your feedback form".c(qw{: . ..})."\n";
+}
+elsif (rand > 0.75) {
+ $hits++;
+ $spam .= "This message is not spam!\n";
+}
+
+while (<>) {
+ # Try to trigger spam trappers. Keep count of the number of unique
+ # ones triggered.
+ @results = (
+ s/^(Subject:\s+.*)/$1. ' ' x (rand(20) + 40) . rand(1000000)/eig,
+ s/free\b/for_free()/eig,
+ s/(email|message|e-mail|mail)\b/$1 (sent in compliance with regulations)/i,
+ s/(join|register|order|apply)/$1 today/ig,
+ s/money/big bucks/i,
+ s/check\b/check or money order/i,
+ s/(amazing|atonishing|neat|interesting)/AMAZING/ig,
+ s/guarantee\b/GUARANTEE/ig,
+ s/(profits|money)/PROFITS/ig,
+ s/(no questions asked|quiet|confidential|secret)\b/NO QUESTIONS ASKED/ig,
+ s/refund\b/full refund/i,
+ s/free\b/FREE/ig,
+ s/\b(full|complete|fully)\b/100% GUARANTEED/ig,
+ s/(spam|UCE)\b/c(qw(bulk direct mass))." email"/eig,
+ s/spammer/businessman/ig,
+ s/(call|phone|contact)\b/CALL NOW/ig,
+ s/business\b/online business/ig,
+ s/online\b/online business opportunities/ig,
+ s/number\b/social security number/ig,
+ s/addresses\b/addresses on cd/ig,
+ s/cdrom\b/addresses on cd/ig,
+ s/click\b/click here/ig,
+ s/viagra/c('VIAGRA', 'natural viagra', 'herbal viagra')/eig,
+ s/\btraffic\b/rand > 0.6 ? 'more web traffic' : 'traffic'/eig,
+ s/targeted/targeted traffic/ig,
+ s/limited/LIMITED TIME OFFER/ig,
+ s/buy\b/buy direct/ig,
+ s/profit\b/PURE PROFIT/ig,
+ s/opportunity/once in a lifetime opportunity/ig,
+ s/stock\b/STOCK PICK/ig,
+ s/access\b/INSTANT ACCESS/ig,
+ s/(diploma|credential)s?/college diploma$a/ig,
+ s/(penis|breast)/larger $1/ig,
+ s/\b(work|job)\b/home employment/ig,
+ s/experience\b/no experience needed!/ig,
+ s/printer\b/printer (toner cartridge)/ig,
+ s/(income|money|savings?)\b/you income/ig,
+ s/(amazing|amazed|atonished|interesting)/be amazed/ig,
+ s/(\$\d+\.?\d*)/for only $1!/ig,
+ s/natural/completly natural/ig,
+ s/obligation/no obligation/ig,
+ s/vacation\b/c(qw(dream special free))." vacation"/eig,
+ s/sign up\b/sign up today/ig,
+ s/cell (phone)?\b/free cell phone/ig,
+ s/(offer|trial|membership|website|quote|installation|sample|dvd|preview|leads)\b/free $1/ig,
+ s/\bvalue/outstanding value/ig,
+ s/shipping/shopping spree/ig,
+ s/winning/WINNING/ig,
+ s/winner\b/WINNER/ig,
+ s/promotion\b/special promotion/ig,
+ s/password\b/free password/ig,
+ s/\bcash\b/extra cash/ig,
+ s/cancel\b/cancel at any time/ig,
+ s/\bearn\b/earn up to/ig,
+ s/(movies|pics|photos|videos)/c(qw(hundreds thousands millions tons))." of $1"/eig,
+ s/\bporn\b/free porn/ig,
+ s/\blegal\b/c(qw(absolutely perfectly totall 100%))." legal"/eig,
+ s/(drugs|medications|pharmacy)/online $1/ig,
+ s/asset/hidden asset/ig,
+ s/\bsave\b/save thousands/ig,
+ s/partner/marketing partner/ig,
+ s/unlimited/UNLIMITED/ig,
+ s/\bprice\b/low price/ig,
+ s/galleries\b/huge galleries/ig,
+ # Convert phone numbers to 800 numbers.
+ s/(?:(?:1-)?[0-9]{3}-)?([0-9]{3}-[0-9]{4})/"1-".c(800,888)."-$1"/eg,
+ # de-http:// urls
+ s/http:\/\///ig,
+ );
+
+ # Merge result table into an overall results table that counts each
+ # item at most once.
+ for ($x=0; $x < $#results; $x++) {
+ if ($results[$x]) {
+ $overallresults[$x]=1;
+ }
+ }
+
+ # Cute things that don't cause real hits.
+ s/\.(com|org|net|edu)\b/".".c(qw(info biz name))/eig;
+ s/([Ee])nglish/${1}ngrish/g if rand > 0.66;
+ $spam .= $_;
+}
+
+$hits += $_ foreach @overallresults;
+
+if (rand > 0.5) {
+ # random line breaks make spam look
+ # more professional
+ # or is it just written in Notepad?
+ $spam =~ s/ /rand > 0.95 ? "\n" : " "/eg;
+}
+elsif (rand > 0.75) {
+ # I write my spam in MS WORD!
+ $spam =~ s/\n/ /g;
+}
+else {
+ $spam=line_of_yelling($spam);
+}
+
+if (rand > 0.8 || $hits < 5) {
+ $spam .= "\nThis is a ".c(qw(one 1))." time ".c(qw(email e-mail offer)).c(qw(! .));
+ $hits++;
+}
+
+if (rand > 0.7 || $hits < 5) {
+ $spam .= "\n" . c('-' x 78, '~' x 70, '---', '', '', '', "\n\n\n\n") . "\n" .
+ c('To remove your address from ', 'To be removed from', 'To get off from',
+ 'To unsubscribe from', 'To receive no further notices on',
+ 'If you did not opt in for', 'To be removed from future mailings to') .
+ " " .
+ c('this mailing list', 'these mails') . " " .
+ c('please ', '') .
+ c('reply', 'send an email', 'write back') . " " .
+ c('with a subject of', 'and put in the subject the word') . " " .
+ c("REMOVE", '"remove"') .
+ c(qw(! . .)) . "\n";
+ $hits++;
+}
+
+# Desperate to make it look like a spam now, I insert arbitrary
+# junk.
+while ($hits < 5) {
+ if (rand > 0.66) {
+ $spam=line_of_yelling($spam);
+ $hits++;
+ }
+ elsif (rand > 0.5) {
+ # Insert a spam phrase after the end of a sentence.
+ @spam_phrases = ('FREE CONSULATATION', 'INSTANT ACCESS',
+ 'PURE PROFIT', 'STOCK PICK', 'VIAGRA', 'WINNER',
+ 'WINNING', 'LIMITED TIME OFFER', 'extra cash',
+ 'CALL NOW', 'once in a lifetime opportunity',
+ 'cancel at any time', 'no experience needed',
+ 'no obligation', 'save millions', 'be amazed',
+ for_free());
+ $hits += $spam =~ s/\.\s+([A-Z])/". ".ucfirst(c(@spam_phrases)). "! $1"/es;
+ }
+ elsif (rand > 0.75) {
+ # large hexadecimal block
+ my @hex = ('A'..'F', 0..9);
+ for (1..70 + rand(9)) {
+ $spam .= $hex[rand @hex];
+ }
+ $spam .= "\n";
+ $hits++;
+ }
+ elsif (rand > 0.75) {
+ $spam .= c("SSPLTM ", "{%RAND%} ");
+ $hits++;
+ }
+}
+
+$spam =~ s/\n/\r\n/g;
+print "$spam\n";
--- /dev/null
+#!/usr/bin/perl
+
+# stUdLy cAPs, after emacs studly.el -- the commented line is just
+# to remind diehards how it *should* be done ;)
+#
+# just for reference, you may do whatever you like with this file.
+#
+# -- nwp@lemon-computing.com
+
+for (my $offset = 0; defined(my $c = getc); $offset++) {
+# (($c + $offset) % 4) == 2 and print (ord($c) ^ 32) or print($c);
+ (($c + $offset) % 4) != 2 and print($c) or $c =~ tr/[A-Za-z]/[a-zA-Z]/, print $c;
+}
--- /dev/null
+#!/usr/bin/perl
+# Ⅽоηνеrt аѕⅽіі tօ υtf‐8.
+use utf8;
+binmode STDOUT, ":utf8";
+
+%Δ=(
+"~" => [],
+"!" => [],
+"@" => [],
+"#" => [],
+'$' => [],
+"%" => [8240],
+"^" => [],
+"&" => [],
+"*" => [10033],
+"(" => [],
+")" => [],
+"_" => [9418],
+"-" => [8208],
+"+" => [],
+"=" => [],
+"[" => [],
+"]" => [],
+"{" => [],
+"}" => [],
+'\\' => [],
+"|" => [9475],
+'"' => [8223],
+"'" => [8217],
+":" => [],
+";" => [],
+"<" => [8249],
+">" => [8250],
+"," => [],
+"." => [],
+"/" => [8260],
+"?" => [],
+
+"1" => [],
+"2" => [],
+"3" => [1047],
+"4" => [],
+"5" => [],
+"6" => [],
+"7" => [],
+"8" => [],
+"9" => [],
+"0" => [1365],
+
+"a" => [1072], "A" => [1040],
+"b" => [1068], "B" => [1042],
+"c" => [1089, 8573, 1010], "C" => [663, 1057, 8557],
+"d" => [1281, 8574], "D" => [8558],
+"e" => [1077], "E" => [917, 1045],
+"f" => [], "F" => [988],
+"g" => [], "G" => [1292],
+"h" => [1210], "H" => [919, 1053],
+"i" => [1110, 8560], "I" => [921, 1030],
+"j" => [1011, 1112], "J" => [1032],
+"k" => [], "K" => [922, 1050],
+"l" => [8572], "L" => [8556],
+"m" => [8575], "M" => [924, 1052, 8559],
+"n" => [951, 627], "N" => [925],
+"o" => [1086, 1413], "O" => [927, 1054],
+"p" => [961, 1088], "P" => [929, 1056],
+"q" => [], "Q" => [],
+"r" => [], "R" => [],
+"s" => [1109], "S" => [1359],
+"t" => [], "T" => [932, 1058],
+"u" => [965], "U" => [],
+"v" => [957, 8910, 8964, 9013], "V" => [947, 8548],
+"w" => [], "W" => [],
+"x" => [1093, 8569, 215], "X" => [935, 1061, 8553],
+"y" => [1059, 1091], "Y" => [933],
+"z" => [], "Z" => [918],
+);
+
+while (<>) {
+ foreach $ם (split //) {
+ if (exists $Δ{$ם} && @{$Δ{$ם}}) {
+ @ה=@{$Δ{$ם}};
+ print chr($ה[rand @ה]);
+ }
+ else {
+ print $ם
+ }
+ }
+}
--- /dev/null
+#!/usr/bin/perl -pl-
+$_=reverse lc$_;s@"@''@g;y/[]{A-R}<>()a-y1-9,!.?`'/][} Joey Hess
+{><)(eq)paj6y!fk7wuodbjsfn^mxhl2Eh59L86`i'%,/;s@k@>|@g# joey@kitenet.net