From: Jacob Adams Date: Sun, 5 Apr 2015 02:26:08 +0000 (-0400) Subject: Import games/caesar and games/rot13 X-Git-Url: http://zhaoyanbai.com/repos/%22http:/www.isc.org/icons/zpipe.c?a=commitdiff_plain;h=refs%2Fchanges%2F85%2F2985%2F1;p=minix.git Import games/caesar and games/rot13 Change-Id: Ib6b074c6c525ee817b9182b17a06ae18851f5afe --- diff --git a/distrib/sets/lists/minix/mi b/distrib/sets/lists/minix/mi index e0d290001..54cfc7cac 100644 --- a/distrib/sets/lists/minix/mi +++ b/distrib/sets/lists/minix/mi @@ -623,8 +623,9 @@ ./usr/games minix-sys ./usr/games/adventure minix-sys ./usr/games/arithmetic minix-sys -./usr/games/bcd minix-sys ./usr/games/banner minix-sys +./usr/games/bcd minix-sys +./usr/games/caesar minix-sys ./usr/games/colorbars minix-sys ./usr/games/factor minix-sys ./usr/games/fish minix-sys @@ -639,6 +640,7 @@ ./usr/games/rain minix-sys ./usr/games/random minix-sys ./usr/games/rogue minix-sys +./usr/games/rot13 minix-sys ./usr/games/snake minix-sys ./usr/games/snscore minix-sys ./usr/games/strfile minix-sys @@ -5166,8 +5168,9 @@ ./usr/man/man6 minix-sys ./usr/man/man6/adventure.6 minix-sys ./usr/man/man6/arithmetic.6 minix-sys -./usr/man/man6/bcd.6 minix-sys ./usr/man/man6/banner.6 minix-sys +./usr/man/man6/bcd.6 minix-sys +./usr/man/man6/caesar.6 minix-sys ./usr/man/man6/colorbars.6 minix-sys ./usr/man/man6/factor.6 minix-sys ./usr/man/man6/fish.6 minix-sys @@ -5181,6 +5184,7 @@ ./usr/man/man6/rain.6 minix-sys ./usr/man/man6/random.6 minix-sys ./usr/man/man6/rogue.6 minix-sys +./usr/man/man6/rot13.6 minix-sys ./usr/man/man6/snake.6 minix-sys ./usr/man/man6/tetris.6 minix-sys ./usr/man/man6/wargames.6 minix-sys diff --git a/games/Makefile b/games/Makefile index 3d2aebfe7..17437f7ab 100644 --- a/games/Makefile +++ b/games/Makefile @@ -9,7 +9,7 @@ SUBDIR= adventure arithmetic \ banner bcd \ - colorbars \ + colorbars caesar \ factor fish fortune \ monop morse number \ pig ppt primes \ diff --git a/games/caesar/Makefile b/games/caesar/Makefile new file mode 100644 index 000000000..875ba587e --- /dev/null +++ b/games/caesar/Makefile @@ -0,0 +1,11 @@ +# $NetBSD: Makefile,v 1.8 2008/01/28 07:03:59 dholland Exp $ +# @(#)Makefile 8.1 (Berkeley) 5/31/93 + +PROG= caesar +MAN= caesar.6 +DPADD= ${LIBM} +LDADD= -lm +MLINKS= caesar.6 rot13.6 +SCRIPTS=rot13.sh + +.include diff --git a/games/caesar/caesar.6 b/games/caesar/caesar.6 new file mode 100644 index 000000000..b959e3b96 --- /dev/null +++ b/games/caesar/caesar.6 @@ -0,0 +1,72 @@ +.\" $NetBSD: caesar.6,v 1.9 2003/08/07 09:37:07 agc Exp $ +.\" +.\" Copyright (c) 1989, 1991, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)caesar.6 8.2 (Berkeley) 11/16/93 +.\" +.Dd November 16, 1993 +.Dt CAESAR 6 +.Os +.Sh NAME +.Nm caesar , +.Nm rot13 +.Nd decrypt caesar ciphers +.Sh SYNOPSIS +.Nm +.Op Ar rotation +.Sh DESCRIPTION +The +.Nm +utility attempts to decrypt caesar ciphers using English letter frequency +statistics. +.Nm +reads from the standard input and writes to the standard output. +.Pp +The optional numerical argument +.Ar rotation +may be used to specify a specific rotation value. +.Pp +The frequency (from most common to least) of English letters is as follows: +.Pp +.Bd -filled -offset indent +ETAONRISHDLFCMUGPYWBVKXJQZ +.Ed +.Pp +Their frequencies as a percentage are as follows: +.Pp +.Bd -filled -offset indent +E(13), T(10.5), A(8.1), O(7.9), N(7.1), R(6.8), I(6.3), S(6.1), H(5.2), +D(3.8), L(3.4), F(2.9), C(2.7), M(2.5), U(2.4), G(2), +P(1.9), Y(1.9), W(1.5), B(1.4), V(.9), K(.4), X(.15), J(.13), Q(.11), Z(.07). +.Ed +.Pp +Rotated postings to +.Tn USENET +and some of the databases used by the +.Xr fortune 6 +program are rotated by 13 characters. diff --git a/games/caesar/caesar.c b/games/caesar/caesar.c new file mode 100644 index 000000000..1a6a8ea23 --- /dev/null +++ b/games/caesar/caesar.c @@ -0,0 +1,218 @@ +/* $NetBSD: caesar.c,v 1.22 2008/07/20 01:03:21 lukem Exp $ */ + +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Rick Adams. + * + * Authors: + * Stan King, John Eldridge, based on algorithm suggested by + * Bob Morris + * 29-Sep-82 + * Roland Illig, 2005 + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#ifndef lint +__COPYRIGHT("@(#) Copyright (c) 1989, 1993\ + The Regents of the University of California. All rights reserved."); +#endif /* not lint */ + +#ifndef lint +#if 0 +static char sccsid[] = "@(#)caesar.c 8.1 (Berkeley) 5/31/93"; +#else +__RCSID("$NetBSD: caesar.c,v 1.22 2008/07/20 01:03:21 lukem Exp $"); +#endif +#endif /* not lint */ + +#include +#include +#include +#include +#include +#include +#include + +#define NCHARS (1 << CHAR_BIT) +#define LETTERS (26) + +/* + * letter frequencies (taken from some unix(tm) documentation) + * (unix is a trademark of Bell Laboratories) + */ +static const unsigned char upper[LETTERS] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; +static const unsigned char lower[LETTERS] = "abcdefghijklmnopqrstuvwxyz"; +static double stdf[LETTERS] = { + 7.97, 1.35, 3.61, 4.78, 12.37, 2.01, 1.46, 4.49, 6.39, 0.04, + 0.42, 3.81, 2.69, 5.92, 6.96, 2.91, 0.08, 6.63, 8.77, 9.68, + 2.62, 0.81, 1.88, 0.23, 2.07, 0.06 +}; + +static unsigned char rottbl[NCHARS]; + + +static void +init_rottbl(int rot) +{ + size_t i; + + rot %= LETTERS; /* prevent integer overflow */ + + for (i = 0; i < NCHARS; i++) + rottbl[i] = (unsigned char)i; + + for (i = 0; i < LETTERS; i++) + rottbl[upper[i]] = upper[(i + rot) % LETTERS]; + + for (i = 0; i < LETTERS; i++) + rottbl[lower[i]] = lower[(i + rot) % LETTERS]; +} + +static void +print_file(void) +{ + int ch; + + while ((ch = getchar()) != EOF) { + if (putchar(rottbl[ch]) == EOF) { + err(EXIT_FAILURE, ""); + /* NOTREACHED */ + } + } +} + +static void +print_array(const unsigned char *a, size_t len) +{ + size_t i; + + for (i = 0; i < len; i++) { + if (putchar(rottbl[a[i]]) == EOF) { + err(EXIT_FAILURE, ""); + /* NOTREACHED */ + } + } +} + +static int +get_rotation(const char *arg) +{ + long rot; + char *endp; + + errno = 0; + rot = strtol(arg, &endp, 10); + if (errno == 0 && (arg[0] == '\0' || *endp != '\0')) + errno = EINVAL; + if (errno == 0 && (rot < 0 || rot > INT_MAX)) + errno = ERANGE; + if (errno) + err(EXIT_FAILURE, "Bad rotation value `%s'", arg); + return (int)rot; +} + +static void +guess_and_rotate(void) +{ + unsigned char inbuf[2048]; + unsigned int obs[NCHARS]; + size_t i, nread; + double dot, winnerdot; + int try, winner; + int ch; + + /* adjust frequency table to weight low probs REAL low */ + for (i = 0; i < LETTERS; i++) + stdf[i] = log(stdf[i]) + log(LETTERS / 100.0); + + /* zero out observation table */ + (void)memset(obs, 0, sizeof(obs)); + + for (nread = 0; nread < sizeof(inbuf); nread++) { + if ((ch = getchar()) == EOF) + break; + inbuf[nread] = (unsigned char) ch; + } + + for (i = 0; i < nread; i++) + obs[inbuf[i]]++; + + /* + * now "dot" the freqs with the observed letter freqs + * and keep track of best fit + */ + winner = 0; + winnerdot = 0.0; + for (try = 0; try < LETTERS; try++) { + dot = 0.0; + for (i = 0; i < LETTERS; i++) + dot += (obs[upper[i]] + obs[lower[i]]) + * stdf[(i + try) % LETTERS]; + + if (try == 0 || dot > winnerdot) { + /* got a new winner! */ + winner = try; + winnerdot = dot; + } + } + + init_rottbl(winner); + print_array(inbuf, nread); + print_file(); +} + +int +main(int argc, char **argv) +{ + + if (argc == 1) { + guess_and_rotate(); + } else if (argc == 2) { + init_rottbl(get_rotation(argv[1])); + print_file(); + } else { + (void)fprintf(stderr, "usage: caesar [rotation]\n"); + exit(EXIT_FAILURE); + /* NOTREACHED */ + } + + if (ferror(stdin)) { + errx(EXIT_FAILURE, ""); + /* NOTREACHED */ + } + + (void)fflush(stdout); + if (ferror(stdout)) { + errx(EXIT_FAILURE, ""); + /* NOTREACHED */ + } + + return 0; +} diff --git a/games/caesar/rot13.sh b/games/caesar/rot13.sh new file mode 100644 index 000000000..005ef8d03 --- /dev/null +++ b/games/caesar/rot13.sh @@ -0,0 +1,39 @@ +#!/bin/sh - +# $NetBSD: rot13.sh,v 1.7 2005/04/09 02:02:15 atatat Exp $ +# +# Copyright (c) 1992, 1993 +# The Regents of the University of California. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by the University of +# California, Berkeley and its contributors. +# 4. Neither the name of the University nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# @(#)rot13.sh 8.1 (Berkeley) 5/31/93 +# + +games="$(dirname $0)" +exec "$games/caesar" 13 "$@"