From 6c363f70858369b3dca6738f37654d1dfc5e8d0f Mon Sep 17 00:00:00 2001 From: hubertf Date: Wed, 18 Nov 1998 14:22:32 +0000 Subject: Add support for decoding of morse code. --- bcd/bcd.6 | 7 +++- morse/morse.c | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 115 insertions(+), 16 deletions(-) diff --git a/bcd/bcd.6 b/bcd/bcd.6 index 3ed0176f..457c59e5 100644 --- a/bcd/bcd.6 +++ b/bcd/bcd.6 @@ -1,4 +1,4 @@ -.\" $NetBSD: bcd.6,v 1.8 1998/09/11 13:13:44 hubertf Exp $ +.\" $NetBSD: bcd.6,v 1.9 1998/11/18 14:22:32 hubertf Exp $ .\" .\" Copyright (c) 1988, 1991, 1993 .\" The Regents of the University of California. All rights reserved. @@ -64,4 +64,9 @@ Available option: The .Fl s option for morse produces dots and dashes rather than words. +.It Fl d +Decode morse output consisting of dots and slashes (as generated +by using the +.Fl s +option. .El diff --git a/morse/morse.c b/morse/morse.c index 68eed79a..c3f2b136 100644 --- a/morse/morse.c +++ b/morse/morse.c @@ -1,4 +1,4 @@ -/* $NetBSD: morse.c,v 1.5 1998/11/18 09:06:26 hubertf Exp $ */ +/* $NetBSD: morse.c,v 1.6 1998/11/18 14:22:32 hubertf Exp $ */ /* * Copyright (c) 1988, 1993 @@ -43,14 +43,19 @@ __COPYRIGHT("@(#) Copyright (c) 1988, 1993\n\ #if 0 static char sccsid[] = "@(#)morse.c 8.1 (Berkeley) 5/31/93"; #else -__RCSID("$NetBSD: morse.c,v 1.5 1998/11/18 09:06:26 hubertf Exp $"); +__RCSID("$NetBSD: morse.c,v 1.6 1998/11/18 14:22:32 hubertf Exp $"); #endif #endif /* not lint */ #include #include +#include #include +#define MORSE_COLON "--..--" +#define MORSE_PERIOD ".-.-.-" + + static char *digit[] = { "-----", @@ -95,9 +100,11 @@ static char int main __P((int, char *[])); void morse __P((int)); +void decode __P((const char *)); void show __P((char *)); static int sflag; +static int dflag; int main(argc, argv) @@ -105,29 +112,116 @@ main(argc, argv) char **argv; { int ch; - char *p; + char *s, *p; - while ((ch = getopt(argc, argv, "s")) != -1) + 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 [-s] [string ...]\n"); + 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); - exit(0); + if (dflag) { + if (*argv) { + do { + s=strchr(*argv, ','); + + if (s) + *s='\0'; + + decode(*argv); + } while (*++argv); + }else{ + char buf[1024]; + + while (fgets(buf, 1024, stdin)) { + s=buf; + + while (*s && isspace(*s)) + s++; + + if (*s) { + p=strtok(s, " \n\t"); + + while (p) { + s=strchr(p, ','); + + if (s) + *s='\0'; + + decode(p); + p=strtok(NULL, " \n\t"); + } + } + } + } + putchar('\n'); + }else{ + if (*argv) + do { + for (p = *argv; *p; ++p) + morse((int)*p); + } while (*++argv); + else while ((ch = getchar()) != EOF) + morse(ch); + } + + return 0; +} + +void +decode(s) + const char *s; +{ + if (strcmp(s, MORSE_COLON) == 0){ + putchar(','); + } else if (strcmp(s, MORSE_PERIOD) == 0){ + putchar('.'); + } else { + int found; + char **a; + int size; + int i; + + found=0; + a=digit; + size=sizeof(digit)/sizeof(digit[0]); + for (i=0; i