* Woo hoo! JWZ has placed newspeak under a BSD-ish license, so it moves
authorjoey <joey@a4a2c43b-8ac3-0310-8836-e0e880c912e2>
Tue, 7 Aug 2001 01:01:01 +0000 (01:01 +0000)
committerjoey <joey@a4a2c43b-8ac3-0310-8836-e0e880c912e2>
Tue, 7 Aug 2001 01:01:01 +0000 (01:01 +0000)
     in from filters-nonfree. Which is now empty, and will be removed.
   * Added studly caps filter by Nick Phillips <nwp@lemon-computing.com>.

Makefile
debian/TODO
debian/changelog
debian/control
debian/copyright
filters.6
jibberish
newspeak.l [new file with mode: 0644]
studly [new file with mode: 0755]

index 1d8cbc5c0f57a4c4c775afae1f2fc63810e1001a..e80d129b0419ea46c1df2e037e49834d6a7c1dcf 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -2,25 +2,25 @@
 
 LEX     = flex
 
 
 LEX     = flex
 
-ALL     = jethro kraut cockney jive nyc ken ky00te
-OTHER   = eleet b1ff chef jibberish upside-down rasterman
+BUILD   = jethro kraut cockney jive nyc ken ky00te newspeak
+OTHER   = eleet b1ff chef jibberish upside-down rasterman studly
 
 
-all:   $(OTHER) $(ALL)
+all:   $(OTHER) $(BUILD)
 
 
-install:       $(ALL) $(OTHER)
+install:       $(BUILD) $(OTHER)
        install -d $(PREFIX)/usr/games
        install -d $(PREFIX)/usr/games
-       install $(ALL) $(OTHER) $(PREFIX)/usr/games/
+       install $(BUILD) $(OTHER) $(PREFIX)/usr/games/
        install -d $(PREFIX)/usr/share/man/man6
        install -m 0644 filters.6 $(PREFIX)/usr/share/man/man6
        cd $(PREFIX)/usr/share/man/man6 && \
        install -d $(PREFIX)/usr/share/man/man6
        install -m 0644 filters.6 $(PREFIX)/usr/share/man/man6
        cd $(PREFIX)/usr/share/man/man6 && \
-               $(foreach prog,$(ALL) $(OTHER),ln -s filters.6 $(prog).6;)
+               $(foreach prog,$(BUILD) $(OTHER),ln -s filters.6 $(prog).6;)
 
 
-samples:       $(ALL) $(OTHER)
+samples:       $(BUILD) $(OTHER)
        -rm -f SAMPLES
        -rm -f SAMPLES
-       PATH=.:$$PATH; export PATH; echo $(ALL) $(OTHER) |xargs -n 1 sh makesample.sh
+       PATH=.:$$PATH; export PATH; echo $(BUILD) $(OTHER) |xargs -n 1 sh makesample.sh
 
 clean:
 
 clean:
-       $(RM) -f core *.o *~ $(ALL) *.c SAMPLES
+       $(RM) -f core *.o *~ $(BUILD) *.c SAMPLES
        cd ky00te.dir && make clean
 
 .SUFFIXES: .l
        cd ky00te.dir && make clean
 
 .SUFFIXES: .l
index 09845a316cf981f59b46156ce0b05902b3118973..053a6de290be760ed4834ad68a5483710b8e482a 100644 (file)
@@ -1,3 +1,3 @@
 * censor filter (should be easy)
 * continue to make the chef filter more similar to the old one
 * censor filter (should be easy)
 * continue to make the chef filter more similar to the old one
-* write more filters
+* write and collect more filters
index e89129952803aafd3f40f7b993f018b28c4ed0c5..a46f423ff958a3279d64ec50c1a9511543a8fcad 100644 (file)
@@ -1,3 +1,11 @@
+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 (2.19) unstable; urgency=low
 
   * Fixed jibberish makesamples run to not use installed versions of the
index 7609864b686e22eb18baa7d6caef804e493e79a1..1e2946c9e965d96b82e1db9c2e3c5adcd85981a1 100644 (file)
@@ -3,13 +3,14 @@ Section: games
 Priority: optional
 Build-Depends: debhelper (>= 2.1.0), flex, bison | byacc | btyacc
 Maintainer: Joey Hess <joeyh@debian.org>
 Priority: optional
 Build-Depends: debhelper (>= 2.1.0), flex, bison | byacc | btyacc
 Maintainer: Joey Hess <joeyh@debian.org>
-Standards-Version: 3.5.5.0
+Standards-Version: 3.5.6.0
 
 Package: filters
 Architecture: any
 
 Package: filters
 Architecture: any
-Conflicts: filters-nonfree (<< 2.7)
-Replaces: filters-nonfree (<< 2.7)
+Conflicts: filters-nonfree
+Replaces: filters-nonfree
 Depends: ${shlibs: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.
 Depends: ${shlibs: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.
+ This includes such favorites as B1FF and the swedish chef, and a wide
+ range of others.
index deaa623a7d50987d981a64fa0de6ed60b40b9b2e..0942180062cd37aae3fc763144870562e17ea207 100644 (file)
@@ -71,3 +71,33 @@ Edwards, confirmed the new copyright in this email:
 Everything else is copyright 1999-2001 by Joey Hess, under the terms of GPL.
 The full text of the GNU GPL can be found in /usr/share/common-licenses/GPL
 on Debian systems.
 Everything else is copyright 1999-2001 by Joey Hess, under the terms of GPL.
 The full text of the GNU GPL can be found in /usr/share/common-licenses/GPL
 on Debian systems.
+
+The newspeak filter is now relicensed under a BSD-like copyright. Its
+author, Jamie Zawinski, 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.
+
+The studly filter is copyright Nick Phillips <nwp@lemon-computing.com> and
+has the following license statement:
+
+# just for reference, you may do whatever you like with this file.
+
index a88c170e95bfb126d221c934c96d580442ffd60f..aa36a3d50923e5e0a79c83f8d297adb1346fcf6a 100644 (file)
--- a/filters.6
+++ b/filters.6
@@ -1,6 +1,6 @@
 .TH FILTERS 6
 .SH NAME
 .TH FILTERS 6
 .SH NAME
-ken, b1ff, chef, cockney, eleet, jethro, jibberish, jive, kraut, ky00te, nyc, rasterman, upside-down \- assorted text filters
+ken, b1ff, chef, cockney, eleet, jethro, jibberish, jive, kraut, ky00te, newspeak, nyc, rasterman, studly, upside-down \- assorted text filters
 .SH SYNOPSIS
  $SHELL | chef
 .SH "DESCRIPTION"
 .SH SYNOPSIS
  $SHELL | chef
 .SH "DESCRIPTION"
@@ -31,10 +31,14 @@ Generates text with a German accent.
 .IP ky00te
 This program places a very cute (and familiar to FurryMuck
 fans) accent on any text file.
 .IP ky00te
 This program places a very cute (and familiar to FurryMuck
 fans) accent on any text file.
+.IP newspeak
+A-la-1984
 .IP nyc
 Brooklyn English
 .IP rasterman
 Makes text look like it came from the keyboard of Carsten Haitzler.
 .IP nyc
 Brooklyn English
 .IP rasterman
 Makes text look like it came from the keyboard of Carsten Haitzler.
+.IP studly
+Studly caps.
 .IP upside-down
 Flips text upside down. Stand on your head and squint to read the output.
 .SH "SEE ALSO"
 .IP upside-down
 Flips text upside down. Stand on your head and squint to read the output.
 .SH "SEE ALSO"
@@ -46,4 +50,6 @@ 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
 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> and kraut is by John Sparks.
+Stephen K Mulrine <skm@eqsn.net>, newspeak is authored by Jamie Zawinski
+<jwz@jwz.org>, studly is by Nick Phillips <nwp@lemon-computing.com>, and
+kraut is by John Sparks.
index 9271ef20cb505dfea1a51269ab248de3753489eb..d5197b82562549e6bbe849a4dd4f94470b633240 100644 (file)
--- a/jibberish
+++ b/jibberish
@@ -16,19 +16,10 @@ nyc
 ken
 ky00te
 rasterman
 ken
 ky00te
 rasterman
-);
-
-@nonfree= qw(
 newspeak
 newspeak
+studly
 );
 
 );
 
-# Test to see if non-free filters are here, if so, add them to @all.
-foreach (@nonfree) {
-       if (-x "/usr/games/$_") {
-               push @all, $_;
-       }
-}
-
 # shuffle order
 srand;
 for (0..$#all) {
 # shuffle order
 srand;
 for (0..$#all) {
diff --git a/newspeak.l b/newspeak.l
new file mode 100644 (file)
index 0000000..67b2c5e
--- /dev/null
@@ -0,0 +1,686 @@
+%{     -*- 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.
+ *
+ *     Permissiom granted for noncommercial use and redistribution.
+ *     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+1);
+\"([.,!?][^\n\".!]+[.!])?\n/[\n\t ]    printf("%c  Hail Big Brother!\"%s",Y1,yytext+2);
+
+.                      printf(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/studly b/studly
new file mode 100755 (executable)
index 0000000..8e69d9b
--- /dev/null
+++ b/studly
@@ -0,0 +1,14 @@
+#!/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;
+}
+
This page took 0.029239 seconds and 4 git commands to generate.