]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - morse/morse.c
Make spacing nicer and add explicit NULL initializers.
[bsdgames-darwin.git] / morse / morse.c
index 46eb1a40f21e54c55092e2e88c265006c3cf87ee..f97de68949c2e877029a5f92a29797618462f17c 100644 (file)
@@ -1,6 +1,8 @@
+/*     $NetBSD: morse.c,v 1.10 2000/07/03 03:57:42 matt Exp $  */
+
 /*
- * Copyright (c) 1988 Regents of the University of California.
- * All rights reserved.
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * SUCH DAMAGE.
  */
 
+#include <sys/cdefs.h>
 #ifndef lint
-char copyright[] =
-"@(#) Copyright (c) 1988 Regents of the University of California.\n\
- All rights reserved.\n";
+__COPYRIGHT("@(#) Copyright (c) 1988, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n");
 #endif /* not lint */
 
 #ifndef lint
-/*static char sccsid[] = "from: @(#)morse.c    5.3 (Berkeley) 2/28/91";*/
-static char rcsid[] = "$Id: morse.c,v 1.2 1993/08/01 18:53:21 mycroft Exp $";
+#if 0
+static char sccsid[] = "@(#)morse.c    8.1 (Berkeley) 5/31/93";
+#else
+__RCSID("$NetBSD: morse.c,v 1.10 2000/07/03 03:57:42 matt 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[] = {
+#define MORSE_COLON    "--..--"
+#define MORSE_PERIOD   ".-.-.-"
+
+
+static const char
+       *const digit[] = {
        "-----",
        ".----",
        "..---",
@@ -58,7 +70,7 @@ static char
        "---..",
        "----.",
 },
-       *alph[] = {
+       *const alph[] = {
        ".-",
        "-...",
        "-.-.",
@@ -87,56 +99,154 @@ static char
        "--..",
 };
 
+int    main __P((int, char *[]));
+void   morse __P((int));
+void   decode __P((const char *));
+void   show __P((const char *));
+
 static int sflag;
+static int dflag;
 
+int
 main(argc, argv)
        int argc;
        char **argv;
 {
-       extern char *optarg;
-       extern int optind;
-       register int ch;
-       register char *p;
+       int ch;
+       char *s, *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 {
+                               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;
+               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;
+                       }
+               }
+
+               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
 morse(c)
-       register int c;
+       int c;
 {
        if (isalpha(c))
                show(alph[c - (isupper(c) ? 'A' : 'a')]);
        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");
 }
 
+void
 show(s)
-       register char *s;
+       const char *s;
 {
        if (sflag)
                printf(" %s", s);