From b9f9ac402c70812f3d5c026df36818b288af2aab Mon Sep 17 00:00:00 2001 From: wiz Date: Thu, 22 Apr 2021 14:57:36 +0000 Subject: cgram: allow providing an input file instead of the random fortune --- cgram/cgram.6 | 15 +++++++++------ cgram/cgram.c | 48 +++++++++++++++++++++++++++++++++++------------- 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/cgram/cgram.6 b/cgram/cgram.6 index 9f315804..88b6f8e7 100644 --- a/cgram/cgram.6 +++ b/cgram/cgram.6 @@ -1,4 +1,4 @@ -.\" $NetBSD: cgram.6,v 1.2 2013/08/04 07:55:09 wiz Exp $ +.\" $NetBSD: cgram.6,v 1.3 2021/04/22 14:57:36 wiz Exp $ .\" .\" Copyright (c) 2004, 2013 The NetBSD Foundation, Inc. .\" All rights reserved. @@ -27,21 +27,24 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.Dd August 3, 2013 +.Dd April 22, 2021 .Dt CGRAM 6 .Os .Sh NAME .Nm cgram .Nd solve Sunday-paper cryptograms .Sh SYNOPSIS -.Nm +.Nm Op Ar file .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. +If +.Ar file +is given, it is used as cleartext, otherwise a random cleartext is +chosen using +.Xr fortune 6 ; +either way, a random substitution key is generated. .Pp The ciphertext is displayed. Typing a letter changes the key so that the letter under the cursor diff --git a/cgram/cgram.c b/cgram/cgram.c index 3c4ca952..1708afb9 100644 --- a/cgram/cgram.c +++ b/cgram/cgram.c @@ -1,4 +1,4 @@ -/* $NetBSD: cgram.c,v 1.17 2021/02/26 15:18:40 rillig Exp $ */ +/* $NetBSD: cgram.c,v 1.18 2021/04/22 14:57:36 wiz Exp $ */ /*- * Copyright (c) 2013, 2021 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include #if defined(__RCSID) && !defined(lint) -__RCSID("$NetBSD: cgram.c,v 1.17 2021/02/26 15:18:40 rillig Exp $"); +__RCSID("$NetBSD: cgram.c,v 1.18 2021/04/22 14:57:36 wiz Exp $"); #endif #include @@ -216,13 +216,7 @@ char_at_cursor(void) return lines.v[cursor_y].s[cursor_x]; } -static void -readquote(void) -{ - FILE *f = popen(_PATH_FORTUNE, "r"); - if (f == NULL) - err(1, "%s", _PATH_FORTUNE); - +static void getquote(FILE *f) { struct string line; string_init(&line); @@ -249,6 +243,30 @@ readquote(void) extent_y = (int)lines.num; for (int i = 0; i < extent_y; i++) extent_x = imax(extent_x, (int)lines.v[i].len); +} + +static void +readfile(const char *name) +{ + FILE *f = fopen(name, "r"); + if (f == NULL) + err(1, "%s", name); + + getquote(f); + + if (fclose(f) != 0) + exit(1); +} + + +static void +readquote(void) +{ + FILE *f = popen(_PATH_FORTUNE, "r"); + if (f == NULL) + err(1, "%s", _PATH_FORTUNE); + + getquote(f); if (pclose(f) != 0) exit(1); /* error message must come from child process */ @@ -535,12 +553,16 @@ handle_key(void) } static void -init(void) +init(const char *filename) { stringarray_init(&lines); stringarray_init(&sollines); srandom((unsigned int)time(NULL)); - readquote(); + if (filename) { + readfile(filename); + } else { + readquote(); + } encode(); initscr(); @@ -573,9 +595,9 @@ clean_up(void) //////////////////////////////////////////////////////////// int -main(void) +main(int argc, char *argv[]) { - init(); + init(argc > 1 ? argv[1] : NULL); loop(); clean_up(); } -- cgit v1.2.3-56-ge451