X-Git-Url: https://git.cameronkatri.com/bsdgames-darwin.git/blobdiff_plain/94b5353c71e7246077d468afe68d51ce85fc213d..5a08466013e8a577ae846ac3ad01522b5cbe5759:/morse/morse.c diff --git a/morse/morse.c b/morse/morse.c index a9045018..823d35d7 100644 --- a/morse/morse.c +++ b/morse/morse.c @@ -1,4 +1,4 @@ -/* $NetBSD: morse.c,v 1.3 1995/03/23 08:35:24 cgd Exp $ */ +/* $NetBSD: morse.c,v 1.18 2018/01/16 06:20:24 maya Exp $ */ /* * Copyright (c) 1988, 1993 @@ -12,11 +12,7 @@ * 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 + * 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. * @@ -33,25 +29,28 @@ * SUCH DAMAGE. */ +#include #ifndef lint -static char copyright[] = -"@(#) Copyright (c) 1988, 1993\n\ - The Regents of the University of California. All rights reserved.\n"; +__COPYRIGHT("@(#) Copyright (c) 1988, 1993\ + The Regents of the University of California. All rights reserved."); #endif /* not lint */ #ifndef lint #if 0 static char sccsid[] = "@(#)morse.c 8.1 (Berkeley) 5/31/93"; #else -static char rcsid[] = "$NetBSD: morse.c,v 1.3 1995/03/23 08:35:24 cgd Exp $"; +__RCSID("$NetBSD: morse.c,v 1.18 2018/01/16 06:20:24 maya Exp $"); #endif #endif /* not lint */ -#include #include +#include +#include +#include +#include -static char - *digit[] = { +static const char + *const digit[] = { "-----", ".----", "..---", @@ -63,7 +62,7 @@ static char "---..", "----.", }, - *alph[] = { + *const alph[] = { ".-", "-...", "-.-.", @@ -92,60 +91,172 @@ static char "--..", }; +static const struct punc { + char c; + const char *morse; +} other[] = { + { '.', ".-.-.-" }, + { ',', "--..--" }, + { ':', "---..." }, + { '?', "..--.." }, + { '\'', ".----." }, + { '-', "-....-" }, + { '/', "-..-." }, + { '(', "-.--." }, + { ')', "-.--.-" }, + { '"', ".-..-." }, + { '=', "-...-" }, + { '+', ".-.-." }, + { '_', "..--.-" }, + { '\0', NULL } +}; + +int main(int, char *[]); +static void morse(int); +static void decode(const char *); +static void show(const char *); + static int sflag; +static int dflag; -main(argc, argv) - int argc; - char **argv; +int +main(int argc, char **argv) { - extern char *optarg; - extern int optind; - register int ch; - register char *p; + int ch; + char *p; - while ((ch = getopt(argc, argv, "s")) != EOF) + /* Revoke setgid privileges */ + setgid(getgid()); + + while ((ch = getopt(argc, argv, "ds")) != -1) switch((char)ch) { + case 'd': + dflag = 1; + break; case 's': sflag = 1; break; case '?': default: - fprintf(stderr, "usage: morse [string ...]"); + fprintf(stderr, "usage: morse [-ds] [string ...]\n"); exit(1); } argc -= optind; argv += optind; - if (*argv) - do { - for (p = *argv; *p; ++p) - morse((int)*p); - } while (*++argv); - else while ((ch = getchar()) != EOF) - morse(ch); + if (dflag) { + if (*argv) { + do { + decode(*argv); + } while (*++argv); + } else { + char foo[10]; /* All morse chars shorter than this */ + int is_blank, i; + + i = 0; + is_blank = 0; + while ((ch = getchar()) != EOF) { + if (ch == '-' || ch == '.') { + foo[i++] = ch; + if (i == 10) { + /* overrun means gibberish--print 'x' and + * advance */ + i = 0; + putchar('x'); + while ((ch = getchar()) != EOF && + (ch == '.' || ch == '-')) + ; + is_blank = 1; + } + } else if (i) { + foo[i] = '\0'; + decode(foo); + i = 0; + is_blank = 0; + } else if (isspace(ch)) { + if (is_blank) { + /* print whitespace for each double blank */ + putchar(' '); + is_blank = 0; + } else + is_blank = 1; + } + } + } + putchar('\n'); + } else { + if (*argv) + do { + for (p = *argv; *p; ++p) + morse((int)*p); + show(""); + } while (*++argv); + else while ((ch = getchar()) != EOF) + morse(ch); + show("...-.-"); /* SK */ + } + + return 0; } -morse(c) - register int c; +void +decode(const char *s) { + int i; + + for (i = 0; i < 10; i++) + if (strcmp(digit[i], s) == 0) { + putchar('0' + i); + return; + } + + for (i = 0; i < 26; i++) + if (strcmp(alph[i], s) == 0) { + putchar('A' + i); + return; + } + i = 0; + while (other[i].c) { + if (strcmp(other[i].morse, s) == 0) { + putchar(other[i].c); + return; + } + i++; + } + if (strcmp("...-.-", s) == 0) + return; + putchar('x'); /* line noise */ +} + +void +morse(int c) +{ + int i; + if (isalpha(c)) show(alph[c - (isupper(c) ? 'A' : 'a')]); else if (isdigit(c)) show(digit[c - '0']); - else if (c == ',') - show("--..--"); - else if (c == '.') - show(".-.-.-"); else if (isspace(c)) - show(" ...\n"); + show(""); /* could show BT for a pause */ + else { + i = 0; + while (other[i].c) { + if (other[i].c == c) { + show(other[i].morse); + break; + } + i++; + } + } } -show(s) - register char *s; +void +show(const char *s) { if (sflag) printf(" %s", s); else for (; *s; ++s) printf(" %s", *s == '.' ? "dit" : "daw"); - printf(",\n"); + printf("\n"); }