diff options
author | hubertf <hubertf@NetBSD.org> | 1998-11-18 14:22:32 +0000 |
---|---|---|
committer | hubertf <hubertf@NetBSD.org> | 1998-11-18 14:22:32 +0000 |
commit | 6c363f70858369b3dca6738f37654d1dfc5e8d0f (patch) | |
tree | 3dc30d0c39fd1d36c24f124eb646631746790fa9 /morse | |
parent | 05159cca9c67098d6b0cc6ac6e47d71dbb044e4b (diff) | |
download | bsdgames-darwin-6c363f70858369b3dca6738f37654d1dfc5e8d0f.tar.gz bsdgames-darwin-6c363f70858369b3dca6738f37654d1dfc5e8d0f.tar.zst bsdgames-darwin-6c363f70858369b3dca6738f37654d1dfc5e8d0f.zip |
Add support for decoding of morse code.
Diffstat (limited to 'morse')
-rw-r--r-- | morse/morse.c | 124 |
1 files changed, 109 insertions, 15 deletions
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 <ctype.h> #include <stdio.h> +#include <string.h> #include <unistd.h> +#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<size; i++) { + if (strcmp(a[i], s) == 0) { + found = 1; + break; + } + } + + if (found) { + putchar('0'+i); + return; + } + + found=0; + a=alph; + size=sizeof(alph)/sizeof(alph[0]); + for (i=0; i<size; i++) { + if (strcmp(a[i], s) == 0) { + found = 1; + break; + } + } + + if (found) + putchar('a'+i); + else + putchar(' '); + } } void @@ -139,9 +233,9 @@ morse(c) else if (isdigit(c)) show(digit[c - '0']); else if (c == ',') - show("--..--"); + show(MORSE_COLON); else if (c == '.') - show(".-.-.-"); + show(MORSE_PERIOD); else if (isspace(c)) show(" ...\n"); } |