]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - morse/morse.c
Fix circle dep
[bsdgames-darwin.git] / morse / morse.c
index a90450187fa5416de13d21a2ca9eb3816af04e7f..823d35d7323a24b81b12ad6c1921340885d59d92 100644 (file)
@@ -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
  * 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.
  *
  * SUCH DAMAGE.
  */
 
+#include <sys/cdefs.h>
 #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 <stdio.h>
 #include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
 
-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");
 }