/* GNU Talkfilters Copyright (C) 1998-2003 Free Software Foundation, Inc. This file is part of GNU Talkfilters GNU Talkfilters 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, or (at your option) any later version. This software is distributed in the hope that it will be amusing, 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 software; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ /* chef - convert English on stdin to Mock Swedish on stdout * * The WC definition matches any word character, and the NW definition matches * any non-word character. Two start conditions are maintained: INW (in word) * and NIW (not in word). The first rule passes TeX commands without change. * * HISTORY * * Apr 26, 1993; John Hagerman: Added ! and ? to the Bork Bork Bork rule. * Apr 15, 1992; John Hagerman: Created. */ %option prefix="chef_yy" %option outfile="lex.yy.c" %option noyywrap %{ #include "common.h" #include "talkfilters.h" #define YY_DECL int yylex(gtf_databuf_t *buf) static int i_seen = 0; %} WC [A-Za-z'] NW [^A-Za-z'] EOT \4 %s INW NIW %% \<(\/)?[A-Za-z][^\>]*\> gtf_echo(); // don't damage HTML tags \\[^ \n\4]+ gtf_echo(); {NW} { BEGIN NIW; i_seen = 0; gtf_echo(); } [.!?]$ { BEGIN NIW; i_seen = 0; gtf_printf("%c\nBork Bork Bork!", yytext[0]); } [Bb]ork/{NW} gtf_echo(); "an" { BEGIN INW; gtf_printf("un"); } "An" { BEGIN INW; gtf_printf("Un"); } "au" { BEGIN INW; gtf_printf("oo"); } "Au" { BEGIN INW; gtf_printf("Oo"); } "a"/{WC} { BEGIN INW; gtf_printf("e"); } "A"/{WC} { BEGIN INW; gtf_printf("E"); } "en"/{NW} { BEGIN INW; gtf_printf("ee"); } "ew" { BEGIN INW; gtf_printf("oo"); } "e"/{NW} { BEGIN INW; gtf_printf("e-a"); } "e" { BEGIN INW; gtf_printf("i"); } "E" { BEGIN INW; gtf_printf("I"); } "f" { BEGIN INW; gtf_printf("ff"); } "ir" { BEGIN INW; gtf_printf("ur"); } "i" { BEGIN INW; gtf_printf(i_seen++ ? "i" : "ee"); } "ow" { BEGIN INW; gtf_printf("oo"); } "o" { BEGIN INW; gtf_printf("oo"); } "O" { BEGIN INW; gtf_printf("Oo"); } "o" { BEGIN INW; gtf_printf("u"); } "the" { BEGIN INW; gtf_printf("zee"); } "The" { BEGIN INW; gtf_printf("Zee"); } "th"/{NW} { BEGIN INW; gtf_printf("t"); } "tion" { BEGIN INW; gtf_printf("shun"); } "u" { BEGIN INW; gtf_printf("oo"); } "U" { BEGIN INW; gtf_printf("Oo"); } "v" { BEGIN INW; gtf_printf("f"); } "V" { BEGIN INW; gtf_printf("F"); } "w" { BEGIN INW; gtf_printf("v"); } "W" { BEGIN INW; gtf_printf("V"); } {EOT} /* ignore trailing EOT character */ . { BEGIN INW; gtf_echo(); } %% #ifdef LIBRARY_MODE int gtf_filter_chef(const char *input, char *buf, size_t bufsz) { gtf_databuf_t buffer; YY_BUFFER_STATE _yybuf; gtf_strbuf_init(&buffer, buf, bufsz); _yybuf = yy_scan_string(input); yylex(&buffer); yy_delete_buffer(_yybuf); gtf_reset(); return(buffer.overflow); } int __gtf_filter_chef(const char *input, char *buf, size_t bufsz) { return(gtf_filter_chef(input, buf, bufsz)); } #else /* LIBRARY_MODE */ int main(int argc, char **argv) { gtf_parse_args(); yylex(NULL); return(EXIT_SUCCESS); } #endif /* LIBRARY_MODE */ /* end of source file */