diff options
Diffstat (limited to '')
-rw-r--r-- | port/caesar/.gitignore | 2 | ||||
-rw-r--r-- | port/caesar/Makefile | 12 | ||||
-rw-r--r-- | port/caesar/caesar.6 | 73 | ||||
-rw-r--r-- | port/caesar/caesar.c | 159 | ||||
-rw-r--r-- | port/caesar/rot13.sh | 33 | ||||
-rw-r--r-- | port/cgram/.gitignore | 1 | ||||
-rw-r--r-- | port/cgram/Makefile | 11 | ||||
-rw-r--r-- | port/cgram/cgram.6 | 65 | ||||
-rw-r--r-- | port/cgram/cgram.c | 344 | ||||
-rw-r--r-- | port/cgram/pathnames.h | 30 | ||||
-rw-r--r-- | port/file2c/.gitignore | 1 | ||||
-rw-r--r-- | port/file2c/Makefile | 9 | ||||
-rw-r--r-- | port/file2c/file2c.1 | 75 | ||||
-rw-r--r-- | port/file2c/file2c.c | 92 |
14 files changed, 907 insertions, 0 deletions
diff --git a/port/caesar/.gitignore b/port/caesar/.gitignore new file mode 100644 index 00000000..e2c3034b --- /dev/null +++ b/port/caesar/.gitignore @@ -0,0 +1,2 @@ +caesar +rot13 diff --git a/port/caesar/Makefile b/port/caesar/Makefile new file mode 100644 index 00000000..cf939acb --- /dev/null +++ b/port/caesar/Makefile @@ -0,0 +1,12 @@ +LDLIBS = -lm + +all: caesar rot13 + +clean: + rm -f caesar rot13 + +install: caesar rot13 caesar.6 + mkdir -p ~/.local/bin ~/.local/share/man/man6 + cp caesar rot13 ~/.local/bin + cp caesar.6 ~/.local/share/man/man6 + cp caesar.6 ~/.local/share/man/man6/rot13.6 diff --git a/port/caesar/caesar.6 b/port/caesar/caesar.6 new file mode 100644 index 00000000..4c4bbfb4 --- /dev/null +++ b/port/caesar/caesar.6 @@ -0,0 +1,73 @@ +.\" 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 +.\" $FreeBSD: releng/11.2/usr.bin/caesar/caesar.6 216239 2010-12-06 19:12:51Z uqs $ +.\" +.Dd November 16, 1993 +.Dt CAESAR 6 +.Os +.Sh NAME +.Nm caesar , rot13 +.Nd decrypt caesar ciphers +.Sh SYNOPSIS +.Nm +.Op Ar rotation +.Nm rot13 +.Sh DESCRIPTION +The +.Nm +utility attempts to decrypt caesar ciphers using English letter frequency +statistics. +.Nm Caesar +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. +If invoked as +.Nm rot13 , +a rotation value of 13 will be used. +.Pp +The frequency (from most common to least) of English letters is as follows: +.Bd -ragged -offset indent +ETAONRISHDLFCMUGPYWBVKXJQZ +.Ed +.Pp +Their frequencies as a percentage are as follows: +.Bd -ragged -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/port/caesar/caesar.c b/port/caesar/caesar.c new file mode 100644 index 00000000..cd6cd579 --- /dev/null +++ b/port/caesar/caesar.c @@ -0,0 +1,159 @@ +/* + * 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 + * + * 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. + */ + +#if 0 +#ifndef lint +static const char copyright[] = +"@(#) Copyright (c) 1989, 1993\n\ + The Regents of the University of California. All rights reserved.\n"; +#endif /* not lint */ + +#ifndef lint +static const char sccsid[] = "@(#)caesar.c 8.1 (Berkeley) 5/31/93"; +#endif /* not lint */ +#endif +#include <sys/cdefs.h> +//__FBSDID("$FreeBSD: releng/11.2/usr.bin/caesar/caesar.c 241846 2012-10-22 03:06:53Z eadler $"); + +#include <errno.h> +#include <math.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <unistd.h> + +#define LINELENGTH 2048 +#define ROTATE(ch, perm) \ + isascii(ch) ? ( \ + isupper(ch) ? ('A' + (ch - 'A' + perm) % 26) : \ + islower(ch) ? ('a' + (ch - 'a' + perm) % 26) : ch) : ch + +/* + * letter frequencies (taken from some unix(tm) documentation) + * (unix is a trademark of Bell Laboratories) + */ +static double stdf[26] = { + 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 void printit(char *); + +int +main(int argc, char **argv) +{ + int ch, dot, i, nread, winnerdot = 0; + char *inbuf; + int obs[26], try, winner; + + if (argc > 1) + printit(argv[1]); + + if (!(inbuf = malloc((size_t)LINELENGTH))) { + (void)fprintf(stderr, "caesar: out of memory.\n"); + exit(1); + } + + /* adjust frequency table to weight low probs REAL low */ + for (i = 0; i < 26; ++i) + stdf[i] = log(stdf[i]) + log(26.0 / 100.0); + + /* zero out observation table */ + bzero(obs, 26 * sizeof(int)); + + if ((nread = read(STDIN_FILENO, inbuf, (size_t)LINELENGTH)) < 0) { + (void)fprintf(stderr, "caesar: %s\n", strerror(errno)); + exit(1); + } + for (i = nread; i--;) { + ch = (unsigned char) inbuf[i]; + if (isascii(ch)) { + if (islower(ch)) + ++obs[ch - 'a']; + else if (isupper(ch)) + ++obs[ch - 'A']; + } + } + + /* + * now "dot" the freqs with the observed letter freqs + * and keep track of best fit + */ + for (try = winner = 0; try < 26; ++try) { /* += 13) { */ + dot = 0; + for (i = 0; i < 26; i++) + dot += obs[i] * stdf[(i + try) % 26]; + /* initialize winning score */ + if (try == 0) + winnerdot = dot; + if (dot > winnerdot) { + /* got a new winner! */ + winner = try; + winnerdot = dot; + } + } + + for (;;) { + for (i = 0; i < nread; ++i) { + ch = (unsigned char) inbuf[i]; + putchar(ROTATE(ch, winner)); + } + if (nread < LINELENGTH) + break; + if ((nread = read(STDIN_FILENO, inbuf, (size_t)LINELENGTH)) < 0) { + (void)fprintf(stderr, "caesar: %s\n", strerror(errno)); + exit(1); + } + } + exit(0); +} + +static void +printit(char *arg) +{ + int ch, rot; + + if ((rot = atoi(arg)) < 0) { + (void)fprintf(stderr, "caesar: bad rotation value.\n"); + exit(1); + } + while ((ch = getchar()) != EOF) + putchar(ROTATE(ch, rot)); + exit(0); +} diff --git a/port/caesar/rot13.sh b/port/caesar/rot13.sh new file mode 100644 index 00000000..8ce4b94e --- /dev/null +++ b/port/caesar/rot13.sh @@ -0,0 +1,33 @@ +#!/bin/sh - +# +# 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. 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 +# $FreeBSD: releng/11.2/usr.bin/caesar/rot13.sh 278616 2015-02-12 05:35:00Z cperciva $ + +exec caesar 13 "$@" diff --git a/port/cgram/.gitignore b/port/cgram/.gitignore new file mode 100644 index 00000000..d4f2ec10 --- /dev/null +++ b/port/cgram/.gitignore @@ -0,0 +1 @@ +cgram diff --git a/port/cgram/Makefile b/port/cgram/Makefile new file mode 100644 index 00000000..1a0b10c1 --- /dev/null +++ b/port/cgram/Makefile @@ -0,0 +1,11 @@ +LDLIBS = -lcurses + +cgram: + +clean: + rm -f cgram + +install: cgram cgram.6 + mkdir -p ~/.local/bin ~/.local/share/man/man6 + cp cgram ~/.local/bin + cp cgram.6 ~/.local/share/man/man6 diff --git a/port/cgram/cgram.6 b/port/cgram/cgram.6 new file mode 100644 index 00000000..9f315804 --- /dev/null +++ b/port/cgram/cgram.6 @@ -0,0 +1,65 @@ +.\" $NetBSD: cgram.6,v 1.2 2013/08/04 07:55:09 wiz Exp $ +.\" +.\" Copyright (c) 2004, 2013 The NetBSD Foundation, Inc. +.\" All rights reserved. +.\" +.\" This code is derived from software contributed to The NetBSD Foundation +.\" by David A. Holland. +.\" +.\" 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. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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. +.\" +.Dd August 3, 2013 +.Dt CGRAM 6 +.Os +.Sh NAME +.Nm cgram +.Nd solve Sunday-paper cryptograms +.Sh SYNOPSIS +.Nm +.Sh DESCRIPTION +.Nm +is a curses-based widget for solving Sunday-paper-type cryptograms +based on substitution ciphers. +A random cleartext is chosen using +.Xr fortune 6 +and a random substitution key is generated. +.Pp +The ciphertext is displayed. +Typing a letter changes the key so that the letter under the cursor +maps to the newly typed letter, and updates the display accordingly. +Use Emacs-type cursor commands to move around. +Enter a tilde +.Pq ~ +to quit. +Press asterisk +.Pq * +to enter an easier mode where correct letters are displayed in +boldface. +.Sh SEE ALSO +.Xr caesar 6 +.Sh HISTORY +.Nm +was written circa 2004. +It was imported into +.Nx +in 2013 and first appeared in +.Nx 7.0 . diff --git a/port/cgram/cgram.c b/port/cgram/cgram.c new file mode 100644 index 00000000..76ea55fb --- /dev/null +++ b/port/cgram/cgram.c @@ -0,0 +1,344 @@ +/*- + * Copyright (c) 2013 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by David A. Holland. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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 <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <ctype.h> +#include <time.h> +#include <err.h> +#include <assert.h> +#include <curses.h> +#include "pathnames.h" + +//////////////////////////////////////////////////////////// + +static char *xstrdup(const char *s) { + char *ret; + + ret = malloc(strlen(s) + 1); + if (ret == NULL) { + errx(1, "Out of memory"); + } + strcpy(ret, s); + return ret; +} + +//////////////////////////////////////////////////////////// + +struct stringarray { + char **v; + int num; +}; + +static void stringarray_init(struct stringarray *a) { + a->v = NULL; + a->num = 0; +} + +static void stringarray_cleanup(struct stringarray *a) { + free(a->v); +} + +static void stringarray_add(struct stringarray *a, const char *s) { + a->v = realloc(a->v, (a->num + 1) * sizeof(a->v[0])); + if (a->v == NULL) { + errx(1, "Out of memory"); + } + a->v[a->num] = xstrdup(s); + a->num++; +} + +//////////////////////////////////////////////////////////// + +static struct stringarray lines; +static struct stringarray sollines; +static bool hinting; +static int scrolldown; +static unsigned curx; +static int cury; + +static void readquote(void) { + FILE *f = popen(_PATH_FORTUNE, "r"); + if (!f) { + err(1, "%s", _PATH_FORTUNE); + } + + char buf[128], buf2[8*sizeof(buf)]; + while (fgets(buf, sizeof(buf), f)) { + char *s = strrchr(buf, '\n'); + assert(s); + assert(strlen(s)==1); + *s = 0; + + int i,j; + for (i=j=0; buf[i]; i++) { + if (buf[i]=='\t') { + buf2[j++] = ' '; + while (j%8) buf2[j++] = ' '; + } + else if (buf[i]=='\b') { + if (j>0) j--; + } + else { + buf2[j++] = buf[i]; + } + } + buf2[j] = 0; + + stringarray_add(&lines, buf2); + stringarray_add(&sollines, buf2); + } + + pclose(f); +} + +static void encode(void) { + int used[26]; + for (int i=0; i<26; i++) used[i] = 0; + + int key[26]; + int keypos=0; + while (keypos < 26) { + int c = random()%26; + if (used[c]) continue; + key[keypos++] = c; + used[c] = 1; + } + + for (int y=0; y<lines.num; y++) { + for (unsigned x=0; lines.v[y][x]; x++) { + if (islower((unsigned char)lines.v[y][x])) { + int q = lines.v[y][x]-'a'; + lines.v[y][x] = 'a'+key[q]; + } + if (isupper((unsigned char)lines.v[y][x])) { + int q = lines.v[y][x]-'A'; + lines.v[y][x] = 'A'+key[q]; + } + } + } +} + +static int substitute(int ch) { + assert(cury>=0 && cury<lines.num); + if (curx >= strlen(lines.v[cury])) { + beep(); + return -1; + } + + int och = lines.v[cury][curx]; + if (!isalpha((unsigned char)och)) { + beep(); + return -1; + } + + int loch = tolower((unsigned char)och); + int uoch = toupper((unsigned char)och); + int lch = tolower((unsigned char)ch); + int uch = toupper((unsigned char)ch); + + for (int y=0; y<lines.num; y++) { + for (unsigned x=0; lines.v[y][x]; x++) { + if (lines.v[y][x]==loch) { + lines.v[y][x] = lch; + } + else if (lines.v[y][x]==uoch) { + lines.v[y][x] = uch; + } + else if (lines.v[y][x]==lch) { + lines.v[y][x] = loch; + } + else if (lines.v[y][x]==uch) { + lines.v[y][x] = uoch; + } + } + } + return 0; +} + +//////////////////////////////////////////////////////////// + +static void redraw(void) { + erase(); + bool won = true; + for (int i=0; i<LINES-1; i++) { + move(i, 0); + int ln = i+scrolldown; + if (ln < lines.num) { + for (unsigned j=0; lines.v[i][j]; j++) { + int ch = lines.v[i][j]; + if (ch != sollines.v[i][j] && isalpha((unsigned char)ch)) { + won = false; + } + bool bold=false; + if (hinting && ch==sollines.v[i][j] && + isalpha((unsigned char)ch)) { + bold = true; + attron(A_BOLD); + } + addch(lines.v[i][j]); + if (bold) { + attroff(A_BOLD); + } + } + } + clrtoeol(); + } + + move(LINES-1, 0); + if (won) { + addstr("*solved* "); + } + addstr("~ to quit, * to cheat, ^pnfb to move"); + + move(LINES-1, 0); + + move(cury-scrolldown, curx); + + refresh(); +} + +static void opencurses(void) { + initscr(); + cbreak(); + noecho(); +} + +static void closecurses(void) { + endwin(); +} + +//////////////////////////////////////////////////////////// + +static void loop(void) { + bool done=false; + while (!done) { + redraw(); + int ch = getch(); + switch (ch) { + case 1: /* ^A */ + curx=0; + break; + case 2: /* ^B */ + if (curx > 0) { + curx--; + } + else if (cury > 0) { + cury--; + curx = strlen(lines.v[cury]); + } + break; + case 5: /* ^E */ + curx = strlen(lines.v[cury]); + break; + case 6: /* ^F */ + if (curx < strlen(lines.v[cury])) { + curx++; + } + else if (cury < lines.num - 1) { + cury++; + curx = 0; + } + break; + case 12: /* ^L */ + clear(); + break; + case 14: /* ^N */ + if (cury < lines.num-1) { + cury++; + } + if (curx > strlen(lines.v[cury])) { + curx = strlen(lines.v[cury]); + } + if (scrolldown < cury - (LINES-2)) { + scrolldown = cury - (LINES-2); + } + break; + case 16: /* ^P */ + if (cury > 0) { + cury--; + } + if (curx > strlen(lines.v[cury])) { + curx = strlen(lines.v[cury]); + } + if (scrolldown > cury) { + scrolldown = cury; + } + break; + case '*': + hinting = !hinting; + break; + case '~': + done = true; + break; + default: + if (isalpha(ch)) { + if (!substitute(ch)) { + if (curx < strlen(lines.v[cury])) { + curx++; + } + if (curx==strlen(lines.v[cury]) && cury < lines.num-1) { + curx=0; + cury++; + } + } + } + else if (curx < strlen(lines.v[cury]) && ch==lines.v[cury][curx]) { + curx++; + if (curx==strlen(lines.v[cury]) && cury < lines.num-1) { + curx=0; + cury++; + } + } + else { + beep(); + } + break; + } + } +} + +//////////////////////////////////////////////////////////// + +int main(void) { + stringarray_init(&lines); + stringarray_init(&sollines); + srandom(time(NULL)); + readquote(); + encode(); + opencurses(); + + loop(); + + closecurses(); + stringarray_cleanup(&sollines); + stringarray_cleanup(&lines); + return 0; +} diff --git a/port/cgram/pathnames.h b/port/cgram/pathnames.h new file mode 100644 index 00000000..40db1eed --- /dev/null +++ b/port/cgram/pathnames.h @@ -0,0 +1,30 @@ +/*- + * Copyright (c) 2013 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by David A. Holland. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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. + */ + +#define _PATH_FORTUNE "fortune" diff --git a/port/file2c/.gitignore b/port/file2c/.gitignore new file mode 100644 index 00000000..aafb358f --- /dev/null +++ b/port/file2c/.gitignore @@ -0,0 +1 @@ +file2c diff --git a/port/file2c/Makefile b/port/file2c/Makefile new file mode 100644 index 00000000..5917b82d --- /dev/null +++ b/port/file2c/Makefile @@ -0,0 +1,9 @@ +file2c: + +clean: + rm -f file2c + +install: file2c file2c.1 + mkdir -p ~/.local/bin ~/.local/share/man/man1 + cp file2c ~/.local/bin + cp file2c.1 ~/.local/share/man/man1 diff --git a/port/file2c/file2c.1 b/port/file2c/file2c.1 new file mode 100644 index 00000000..fe1fe5e7 --- /dev/null +++ b/port/file2c/file2c.1 @@ -0,0 +1,75 @@ +.\"---------------------------------------------------------------------------- +.\" "THE BEER-WARE LICENSE" (Revision 42): +.\" <phk@FreeBSD.org> wrote this file. As long as you retain this notice, you +.\" can do whatever you want with this file. If we meet some day, and you think +.\" this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp +.\" --------------------------------------------------------------------------- +.\" +.\" $FreeBSD: releng/11.2/usr.bin/file2c/file2c.1 173197 2007-10-30 17:49:00Z ru $ +.\" +.Dd March 22, 2007 +.Dt FILE2C 1 +.Os +.Sh NAME +.Nm file2c +.Nd convert file to c-source +.Sh SYNOPSIS +.Nm +.Op Fl sx +.Op Fl n Ar count +.Op Ar prefix Op Ar suffix +.Sh DESCRIPTION +The +.Nm +utility reads a file from stdin and writes it to stdout, converting each +byte to its decimal or hexadecimal representation on the fly. +The byte values are separated by a comma. +This also means that the last byte value is not followed by a comma. +By default the byte values are printed in decimal, but when the +.Fl x +option is given, the values will be printed in hexadecimal. +When +.Fl s +option is given, each line is printed with a leading tab and each comma is +followed by a space except for the last one on the line. +.Pp +If more than 70 characters are printed on the same line, that line is +ended and the output continues on the next line. +With the +.Fl n +option this can be made to happen after the specified number of +byte values have been printed. +The length of the line will not be considered anymore. +To have all the byte values printed on the same line, give the +.Fl n +option a negative number. +.Pp +A prefix and suffix strings can be printed before and after the byte values +(resp.) +If a suffix is to be printed, a prefix must also be specified. +The first non-option word is the prefix, which may optionally be followed +by a word that is to be used as the suffix. +.Pp +This program is typically used to embed binary files into C source files. +The prefix is used to define an array type and the suffix is used to end +the C statement. +The +.Fl n , s +and +.Fl x +options are useful when the binary data represents a bitmap and the output +needs to remain readable and/or editable. +Fonts, for example, are a good example of this. +.Sh EXAMPLES +The command: +.Bd -literal -offset indent +date | file2c 'const char date[] = {' ',0};' +.Ed +.Pp +will produce: +.Bd -literal -offset indent +const char date[] = { +83,97,116,32,74,97,110,32,50,56,32,49,54,58,50,56,58,48,53, +32,80,83,84,32,49,57,57,53,10 +,0}; +.Ed diff --git a/port/file2c/file2c.c b/port/file2c/file2c.c new file mode 100644 index 00000000..cff7f602 --- /dev/null +++ b/port/file2c/file2c.c @@ -0,0 +1,92 @@ +/* + * ---------------------------------------------------------------------------- + * "THE BEER-WARE LICENSE" (Revision 42): + * <phk@FreeBSD.org> wrote this file. As long as you retain this notice you + * can do whatever you want with this stuff. If we meet some day, and you think + * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp + * ---------------------------------------------------------------------------- + */ + +#include <sys/cdefs.h> +//__FBSDID("$FreeBSD: releng/11.2/usr.bin/file2c/file2c.c 200462 2009-12-13 03:14:06Z delphij $"); + +#include <limits.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +static void +usage(void) +{ + + fprintf(stderr, "usage: %s [-sx] [-n count] [prefix [suffix]]\n", + "file2c"); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + int c, count, linepos, maxcount, pretty, radix; + + maxcount = 0; + pretty = 0; + radix = 10; + while ((c = getopt(argc, argv, "n:sx")) != -1) { + switch (c) { + case 'n': /* Max. number of bytes per line. */ + maxcount = strtol(optarg, NULL, 10); + break; + case 's': /* Be more style(9) comliant. */ + pretty = 1; + break; + case 'x': /* Print hexadecimal numbers. */ + radix = 16; + break; + case '?': + default: + usage(); + } + } + argc -= optind; + argv += optind; + + if (argc > 0) + printf("%s\n", argv[0]); + count = linepos = 0; + while((c = getchar()) != EOF) { + if (count) { + putchar(','); + linepos++; + } + if ((maxcount == 0 && linepos > 70) || + (maxcount > 0 && count >= maxcount)) { + putchar('\n'); + count = linepos = 0; + } + if (pretty) { + if (count) { + putchar(' '); + linepos++; + } else { + putchar('\t'); + linepos += 8; + } + } + switch (radix) { + case 10: + linepos += printf("%d", c); + break; + case 16: + linepos += printf("0x%02x", c); + break; + default: + abort(); + } + count++; + } + putchar('\n'); + if (argc > 1) + printf("%s\n", argv[1]); + return (0); +} |