From 7e874ae62dec339c6ec7c49e64db0b31a2b3170b Mon Sep 17 00:00:00 2001 From: jsm Date: Fri, 13 Feb 2004 23:16:11 +0000 Subject: [PATCH] Encode and decode more characters. Don't put commas after every character. Don't encode whitespace as "...". Don't fail decoding across a 1024-byte boundary. Mark end of message appropriately. From OpenBSD but with punctuation taken from ITU-T Recommendation F.1 (03/98). --- morse/morse.c | 162 +++++++++++++++++++++++++++----------------------- 1 file changed, 88 insertions(+), 74 deletions(-) diff --git a/morse/morse.c b/morse/morse.c index 076bec51..dfafa5c3 100644 --- a/morse/morse.c +++ b/morse/morse.c @@ -1,4 +1,4 @@ -/* $NetBSD: morse.c,v 1.12 2004/01/27 20:30:30 jsm Exp $ */ +/* $NetBSD: morse.c,v 1.13 2004/02/13 23:16:11 jsm Exp $ */ /* * Copyright (c) 1988, 1993 @@ -39,7 +39,7 @@ __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.12 2004/01/27 20:30:30 jsm Exp $"); +__RCSID("$NetBSD: morse.c,v 1.13 2004/02/13 23:16:11 jsm Exp $"); #endif #endif /* not lint */ @@ -49,10 +49,6 @@ __RCSID("$NetBSD: morse.c,v 1.12 2004/01/27 20:30:30 jsm Exp $"); #include #include -#define MORSE_COLON "--..--" -#define MORSE_PERIOD ".-.-.-" - - static const char *const digit[] = { "-----", @@ -95,6 +91,25 @@ static const char "--..", }; +const struct punc { + char c; + const char *morse; +} other[] = { + { '.', ".-.-.-" }, + { ',', "--..--" }, + { ':', "---..." }, + { '?', "..--.." }, + { '\'', ".----." }, + { '-', "-....-" }, + { '/', "-..-." }, + { '(', "-.--." }, + { ')', "-.--.-" }, + { '"', ".-..-." }, + { '=', "-...-" }, + { '+', ".-.-." }, + { '\0', NULL } +}; + int main(int, char *[]); void morse(int); void decode(const char *); @@ -109,7 +124,7 @@ main(argc, argv) char **argv; { int ch; - char *s, *p; + char *p; /* Revoke setgid privileges */ setgid(getgid()); @@ -133,46 +148,53 @@ main(argc, argv) 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"); + } else { + char foo[10]; /* All morse chars shorter than this */ + int isblank, i; + + i = 0; + isblank = 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 == '-')) + ; + isblank = 1; } + } else if (i) { + foo[i] = '\0'; + decode(foo); + i = 0; + isblank = 0; + } else if (isspace(ch)) { + if (isblank) { + /* print whitespace for each double blank */ + putchar(' '); + isblank = 0; + } else + isblank = 1; } } } putchar('\n'); - }else{ + } 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; @@ -182,62 +204,54 @@ void decode(s) const char *s; { - if (strcmp(s, MORSE_COLON) == 0){ - putchar(','); - } else if (strcmp(s, MORSE_PERIOD) == 0){ - putchar('.'); - } else { - int found; - const char *const *a; - int size; - int i; - - found=0; - a=digit; - size=sizeof(digit)/sizeof(digit[0]); - for (i=0; i