filters (2.49) unstable; urgency=low
authorJoey Hess <joeyh@debian.org>
Sun, 5 May 2013 03:48:11 +0000 (20:48 -0700)
committerJoey Hess <joeyh@debian.org>
Sun, 5 May 2013 03:48:11 +0000 (20:48 -0700)
  * scottish: Fix typo. Closes: #688905
  * lolcat: New filter.

# imported from the archive

46 files changed:
GPL [new file with mode: 0644]
Makefile [new file with mode: 0644]
README [new file with mode: 0644]
b1ff [new file with mode: 0755]
censor [new file with mode: 0755]
chef [new file with mode: 0755]
cockney.l [new file with mode: 0644]
debian/TODO [new file with mode: 0644]
debian/changelog [new file with mode: 0644]
debian/compat [new file with mode: 0644]
debian/control [new file with mode: 0644]
debian/copyright [new file with mode: 0644]
debian/docs [new file with mode: 0644]
debian/rules [new file with mode: 0755]
eleet [new file with mode: 0755]
fanboy [new file with mode: 0755]
filters.6 [new file with mode: 0644]
fudd [new file with mode: 0755]
jethro.l [new file with mode: 0644]
jibberish [new file with mode: 0755]
jive.l [new file with mode: 0644]
ken.l [new file with mode: 0644]
kenny [new file with mode: 0755]
kraut.dir/destructions [new file with mode: 0644]
kraut.dir/kraut.c [new file with mode: 0644]
kraut.dir/kraut.l [new file with mode: 0644]
ky00te.dir/README.ky00te [new file with mode: 0644]
ky00te.dir/ky00te.lex [new file with mode: 0644]
ky00te.dir/ky00te.yacc [new file with mode: 0644]
ky00te.dir/makefile [new file with mode: 0644]
lolcat [new file with mode: 0755]
makesample.sh [new file with mode: 0644]
nethackify.dir/makefile [new file with mode: 0644]
nethackify.dir/nethackify.c [new file with mode: 0644]
nethackify.dir/readme [new file with mode: 0644]
newspeak.l [new file with mode: 0644]
nyc.l [new file with mode: 0644]
pirate [new file with mode: 0755]
rasterman [new file with mode: 0755]
scottish [new file with mode: 0755]
scramble.dir/Makefile [new file with mode: 0644]
scramble.dir/scramble.c [new file with mode: 0644]
spammer [new file with mode: 0755]
studly [new file with mode: 0755]
uniencode [new file with mode: 0755]
upside-down [new file with mode: 0755]

diff --git a/GPL b/GPL
new file mode 100644 (file)
index 0000000..d60c31a
--- /dev/null
+++ b/GPL
@@ -0,0 +1,340 @@
+                   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.
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..578678e
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,65 @@
+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
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..5b084af
--- /dev/null
+++ b/README
@@ -0,0 +1,106 @@
+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>
diff --git a/b1ff b/b1ff
new file mode 100755 (executable)
index 0000000..0f1ad43
--- /dev/null
+++ b/b1ff
@@ -0,0 +1,118 @@
+#!/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;
+}
diff --git a/censor b/censor
new file mode 100755 (executable)
index 0000000..36ea3ed
--- /dev/null
+++ b/censor
@@ -0,0 +1,61 @@
+#!/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
diff --git a/chef b/chef
new file mode 100755 (executable)
index 0000000..57c3d65
--- /dev/null
+++ b/chef
@@ -0,0 +1,67 @@
+#!/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;
diff --git a/cockney.l b/cockney.l
new file mode 100644 (file)
index 0000000..f6d0ad2
--- /dev/null
+++ b/cockney.l
@@ -0,0 +1,191 @@
+%{
+/*
+ *     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
+*/
+}
diff --git a/debian/TODO b/debian/TODO
new file mode 100644 (file)
index 0000000..ad4e968
--- /dev/null
@@ -0,0 +1,4 @@
+* 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..
diff --git a/debian/changelog b/debian/changelog
new file mode 100644 (file)
index 0000000..1af2543
--- /dev/null
@@ -0,0 +1,423 @@
+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
diff --git a/debian/compat b/debian/compat
new file mode 100644 (file)
index 0000000..7f8f011
--- /dev/null
@@ -0,0 +1 @@
+7
diff --git a/debian/control b/debian/control
new file mode 100644 (file)
index 0000000..3865468
--- /dev/null
@@ -0,0 +1,19 @@
+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.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644 (file)
index 0000000..900ee9e
--- /dev/null
@@ -0,0 +1,137 @@
+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.
diff --git a/debian/docs b/debian/docs
new file mode 100644 (file)
index 0000000..cf662ef
--- /dev/null
@@ -0,0 +1 @@
+README SAMPLES ky00te.dir/README.ky00te
diff --git a/debian/rules b/debian/rules
new file mode 100755 (executable)
index 0000000..bda6f51
--- /dev/null
@@ -0,0 +1,7 @@
+#!/usr/bin/make -f
+%:
+       dh $@
+
+# Not intended for use by anyone except the author.
+announcedir:
+       @echo ${HOME}/src/joeywiki/code/filters/news
diff --git a/eleet b/eleet
new file mode 100755 (executable)
index 0000000..9e0fb77
--- /dev/null
+++ b/eleet
@@ -0,0 +1,19 @@
+#!/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;
diff --git a/fanboy b/fanboy
new file mode 100755 (executable)
index 0000000..3881f0a
--- /dev/null
+++ b/fanboy
@@ -0,0 +1,65 @@
+#!/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;
diff --git a/filters.6 b/filters.6
new file mode 100644 (file)
index 0000000..29f9bd9
--- /dev/null
+++ b/filters.6
@@ -0,0 +1,105 @@
+.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.
diff --git a/fudd b/fudd
new file mode 100755 (executable)
index 0000000..71460f2
--- /dev/null
+++ b/fudd
@@ -0,0 +1,14 @@
+#!/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;
diff --git a/jethro.l b/jethro.l
new file mode 100644 (file)
index 0000000..408d396
--- /dev/null
+++ b/jethro.l
@@ -0,0 +1,265 @@
+
+ /* 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!!!");
+
+%%
diff --git a/jibberish b/jibberish
new file mode 100755 (executable)
index 0000000..af0ea16
--- /dev/null
+++ b/jibberish
@@ -0,0 +1,49 @@
+#!/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?
diff --git a/jive.l b/jive.l
new file mode 100644 (file)
index 0000000..1171975
--- /dev/null
+++ b/jive.l
@@ -0,0 +1,253 @@
+%{
+/*
+ *     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
+ */
diff --git a/ken.l b/ken.l
new file mode 100644 (file)
index 0000000..dc2ce76
--- /dev/null
+++ b/ken.l
@@ -0,0 +1,288 @@
+%{
+/*
+ * 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");
+%%
diff --git a/kenny b/kenny
new file mode 100755 (executable)
index 0000000..f9e8dce
--- /dev/null
+++ b/kenny
@@ -0,0 +1,384 @@
+#!/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
+    ;
+}
diff --git a/kraut.dir/destructions b/kraut.dir/destructions
new file mode 100644 (file)
index 0000000..4390437
--- /dev/null
@@ -0,0 +1,36 @@
+                                     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
+
diff --git a/kraut.dir/kraut.c b/kraut.dir/kraut.c
new file mode 100644 (file)
index 0000000..e09ba5f
--- /dev/null
@@ -0,0 +1,25 @@
+#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);
+}
diff --git a/kraut.dir/kraut.l b/kraut.dir/kraut.l
new file mode 100644 (file)
index 0000000..e46acde
--- /dev/null
@@ -0,0 +1,81 @@
+%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");
+
+%%
+
+
diff --git a/ky00te.dir/README.ky00te b/ky00te.dir/README.ky00te
new file mode 100644 (file)
index 0000000..7c92969
--- /dev/null
@@ -0,0 +1,83 @@
+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.
+
diff --git a/ky00te.dir/ky00te.lex b/ky00te.dir/ky00te.lex
new file mode 100644 (file)
index 0000000..63f877c
--- /dev/null
@@ -0,0 +1,64 @@
+%{
+
+#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); } 
+%%
+
+
+
+
diff --git a/ky00te.dir/ky00te.yacc b/ky00te.dir/ky00te.yacc
new file mode 100644 (file)
index 0000000..4254394
--- /dev/null
@@ -0,0 +1,133 @@
+%{
+
+#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;
+}
+
+
diff --git a/ky00te.dir/makefile b/ky00te.dir/makefile
new file mode 100644 (file)
index 0000000..47d1f64
--- /dev/null
@@ -0,0 +1,21 @@
+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
+
diff --git a/lolcat b/lolcat
new file mode 100755 (executable)
index 0000000..22c4a58
--- /dev/null
+++ b/lolcat
@@ -0,0 +1,86 @@
+#!/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/;
diff --git a/makesample.sh b/makesample.sh
new file mode 100644 (file)
index 0000000..e7e5e16
--- /dev/null
@@ -0,0 +1,11 @@
+#!/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
diff --git a/nethackify.dir/makefile b/nethackify.dir/makefile
new file mode 100644 (file)
index 0000000..8c2fd9e
--- /dev/null
@@ -0,0 +1,16 @@
+../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
diff --git a/nethackify.dir/nethackify.c b/nethackify.dir/nethackify.c
new file mode 100644 (file)
index 0000000..1f6cb6c
--- /dev/null
@@ -0,0 +1,87 @@
+
+/*
+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;
+}
diff --git a/nethackify.dir/readme b/nethackify.dir/readme
new file mode 100644 (file)
index 0000000..470d3da
--- /dev/null
@@ -0,0 +1,9 @@
+
+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>
diff --git a/newspeak.l b/newspeak.l
new file mode 100644 (file)
index 0000000..ce0f573
--- /dev/null
@@ -0,0 +1,685 @@
+%{     -*- 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);  }
diff --git a/nyc.l b/nyc.l
new file mode 100644 (file)
index 0000000..b00f2b0
--- /dev/null
+++ b/nyc.l
@@ -0,0 +1,108 @@
+%{
+/*
+ *     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;
+}
diff --git a/pirate b/pirate
new file mode 100755 (executable)
index 0000000..67ad872
--- /dev/null
+++ b/pirate
@@ -0,0 +1,138 @@
+#!/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;
+       }
+}
diff --git a/rasterman b/rasterman
new file mode 100755 (executable)
index 0000000..2f36574
--- /dev/null
+++ b/rasterman
@@ -0,0 +1,101 @@
+#!/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;
+    }
+}
+
diff --git a/scottish b/scottish
new file mode 100755 (executable)
index 0000000..805b1da
--- /dev/null
+++ b/scottish
@@ -0,0 +1,51 @@
+#!/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;
+}
diff --git a/scramble.dir/Makefile b/scramble.dir/Makefile
new file mode 100644 (file)
index 0000000..4b4e7cd
--- /dev/null
@@ -0,0 +1,5 @@
+../scramble: scramble.c
+       $(CC) -o $@ $< -O2 -g
+
+clean:
+       rm -f ../scramble
diff --git a/scramble.dir/scramble.c b/scramble.dir/scramble.c
new file mode 100644 (file)
index 0000000..fc35ff8
--- /dev/null
@@ -0,0 +1,205 @@
+/* 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;
+}
diff --git a/spammer b/spammer
new file mode 100755 (executable)
index 0000000..678e827
--- /dev/null
+++ b/spammer
@@ -0,0 +1,196 @@
+#!/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";
diff --git a/studly b/studly
new file mode 100755 (executable)
index 0000000..21a4d02
--- /dev/null
+++ b/studly
@@ -0,0 +1,13 @@
+#!/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;
+}
diff --git a/uniencode b/uniencode
new file mode 100755 (executable)
index 0000000..2a80c0d
--- /dev/null
+++ b/uniencode
@@ -0,0 +1,88 @@
+#!/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 $ם
+               }
+       }
+}
diff --git a/upside-down b/upside-down
new file mode 100755 (executable)
index 0000000..c8f57e2
--- /dev/null
@@ -0,0 +1,3 @@
+#!/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
This page took 0.092642 seconds and 4 git commands to generate.