]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - morse/morse.c
Fix circle dep
[bsdgames-darwin.git] / morse / morse.c
index d9086e8e9bf461eab2c2e686d82ec72256916e34..823d35d7323a24b81b12ad6c1921340885d59d92 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: morse.c,v 1.7 1999/09/08 21:17:53 jsm 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.
  *
 
 #include <sys/cdefs.h>
 #ifndef lint
-__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
-__RCSID("$NetBSD: morse.c,v 1.7 1999/09/08 21:17:53 jsm Exp $");
+__RCSID("$NetBSD: morse.c,v 1.18 2018/01/16 06:20:24 maya Exp $");
 #endif
 #endif /* not lint */
 
 #include <ctype.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 
-#define MORSE_COLON    "--..--"
-#define MORSE_PERIOD   ".-.-.-"
-
-
 static const char
        *const digit[] = {
        "-----",
@@ -98,21 +91,42 @@ static const char
        "--..",
 };
 
-int    main __P((int, char *[]));
-void   morse __P((int));
-void   decode __P((const char *));
-void   show __P((const 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;
 
 int
-main(argc, argv)
-       int argc;
-       char **argv;
+main(int argc, char **argv)
 {
        int ch;
-       char *s, *p;
+       char *p;
+
+       /* Revoke setgid privileges */
+       setgid(getgid());
 
        while ((ch = getopt(argc, argv, "ds")) != -1)
                switch((char)ch) {
@@ -133,120 +147,116 @@ 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 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{
+       } 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;
 }
 
 void
-decode(s)
-       const char *s;
+decode(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<size; i++) {
-                       if (strcmp(a[i], s) == 0) {
-                               found = 1;
-                               break;
-                       }
+       int i;
+       
+       for (i = 0; i < 10; i++)
+               if (strcmp(digit[i], s) == 0) {
+                       putchar('0' + i);
+                       return;
                }
-
-               if (found) {
-                       putchar('0'+i);
+       
+       for (i = 0; i < 26; i++)
+               if (strcmp(alph[i], s) == 0) {
+                       putchar('A' + 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;
-                       }
+       i = 0;
+       while (other[i].c) {
+               if (strcmp(other[i].morse, s) == 0) {
+                       putchar(other[i].c);
+                       return;
                }
-
-               if (found)
-                       putchar('a'+i);
-               else
-                       putchar(' ');
+               i++;
        }
+       if (strcmp("...-.-", s) == 0)
+               return;
+       putchar('x');   /* line noise */
 }
 
 void
-morse(c)
-       int c;
+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(MORSE_COLON);
-       else if (c == '.')
-               show(MORSE_PERIOD);
        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++;
+               }
+       }
 }
 
 void
-show(s)
-       const char *s;
+show(const char *s)
 {
        if (sflag)
                printf(" %s", s);
        else for (; *s; ++s)
                printf(" %s", *s == '.' ? "dit" : "daw");
-       printf(",\n");
+       printf("\n");
 }