home *** CD-ROM | disk | FTP | other *** search
/ ftp.ee.lbl.gov / 2014.05.ftp.ee.lbl.gov.tar / ftp.ee.lbl.gov / sst.tar.Z / sst.tar / sst / morse.c < prev    next >
C/C++ Source or Header  |  1990-01-10  |  5KB  |  308 lines

  1. /* morse.c - turn ASCII text into morse code
  2. **
  3. ** Copyright (C) 1989 by Jef Poskanzer.
  4. **
  5. ** Permission to use, copy, modify, and distribute this software and its
  6. ** documentation for any purpose and without fee is hereby granted, provided
  7. ** that the above copyright notice appear in all copies and that both that
  8. ** copyright notice and this permission notice appear in supporting
  9. ** documentation.  This software is provided"as is" without express or
  10. ** implied warranty.
  11. */
  12.  
  13. #include <stdio.h>
  14. #include <fcntl.h>
  15. #include <sys/signal.h>
  16. #include"libsst.h"
  17.  
  18. #define max(a,b) ((a) > (b) ? (a) : (b))
  19.  
  20. #define MORSE_HZ 440
  21. #define DEFAULT_WPM 10.0
  22.  
  23. int sst_fd;
  24. int dot_usec, dash_usec, intertone_usec, interchar_usec, interword_usec;
  25.  
  26. main( argc, argv )
  27. int argc;
  28. char *argv[];
  29.     {
  30.     int argn, ic;
  31.     float wpm;
  32.     double atof();
  33.     int sighandler();
  34.     char *usage = "usage:  %s [-wpm <n>] [file]\n";
  35.  
  36.     argn = 1;
  37.     wpm = DEFAULT_WPM;
  38.     if ( argn < argc && argv[argn][0] == '-' )
  39.     {
  40.     if ( strncmp( argv[argn], "-wpm", max(strlen( argv[argn] ),2) ) == 0 )
  41.         {
  42.         ++argn;
  43.         wpm = atof( argv[argn] );
  44.         }
  45.     else
  46.         {
  47.         fprintf( stderr, usage, argv[0] );
  48.         exit( 1 );
  49.         }
  50.     ++argn;
  51.     }
  52.     
  53.     if ( argn < argc )
  54.     {
  55.     if ( freopen( argv[argn], "r", stdin ) == NULL )
  56.         {
  57.         perror( argv[argn] );
  58.         exit( 1 );
  59.         }
  60.     ++argn;
  61.     }
  62.  
  63.     if ( argn != argc )
  64.     {
  65.     fprintf( stderr, usage, argv[0] );
  66.     exit( 1 );
  67.     }
  68.  
  69.     dot_usec =        200000 * DEFAULT_WPM / wpm;
  70.     dash_usec =       500000 * DEFAULT_WPM / wpm;
  71.     intertone_usec =  200000 * DEFAULT_WPM / wpm;
  72.     interchar_usec =  500000 * DEFAULT_WPM / wpm;
  73.     interword_usec = 1000000 * DEFAULT_WPM / wpm;
  74.  
  75.     sst_fd = sst_open( );
  76.     (void) signal( SIGHUP, sighandler );
  77.     (void) signal( SIGINT, sighandler );
  78.  
  79.     while ( ( ic = getchar( ) ) != EOF )
  80.     {
  81.     switch ( ic )
  82.         {
  83.         case 'a':
  84.         case 'A':
  85.         doit( ".-" );
  86.         break;
  87.  
  88.         case 'b':
  89.         case 'B':
  90.         doit( "-..." );
  91.         break;
  92.  
  93.         case 'c':
  94.         case 'C':
  95.         doit( "-.-." );
  96.         break;
  97.  
  98.         case 'd':
  99.         case 'D':
  100.         doit( "-.." );
  101.         break;
  102.  
  103.         case 'e':
  104.         case 'E':
  105.         doit( "." );
  106.         break;
  107.  
  108.         case 'f':
  109.         case 'F':
  110.         doit( "..-." );
  111.         break;
  112.  
  113.         case 'g':
  114.         case 'G':
  115.         doit( "--." );
  116.         break;
  117.  
  118.         case 'h':
  119.         case 'H':
  120.         doit( "...." );
  121.         break;
  122.  
  123.         case 'i':
  124.         case 'I':
  125.         doit( ".." );
  126.         break;
  127.  
  128.         case 'j':
  129.         case 'J':
  130.         doit( ".---" );
  131.         break;
  132.  
  133.         case 'k':
  134.         case 'K':
  135.         doit( "-.-" );
  136.         break;
  137.  
  138.         case 'l':
  139.         case 'L':
  140.         doit( ".-.." );
  141.         break;
  142.  
  143.         case 'm':
  144.         case 'M':
  145.         doit( "--" );
  146.         break;
  147.  
  148.         case 'n':
  149.         case 'N':
  150.         doit( "-." );
  151.         break;
  152.  
  153.         case 'o':
  154.         case 'O':
  155.         doit( "---" );
  156.         break;
  157.  
  158.         case 'p':
  159.         case 'P':
  160.         doit( ".--." );
  161.         break;
  162.  
  163.         case 'q':
  164.         case 'Q':
  165.         doit( "--.-" );
  166.         break;
  167.  
  168.         case 'r':
  169.         case 'R':
  170.         doit( ".-." );
  171.         break;
  172.  
  173.         case 's':
  174.         case 'S':
  175.         doit( "..." );
  176.         break;
  177.  
  178.         case 't':
  179.         case 'T':
  180.         doit( "-" );
  181.         break;
  182.  
  183.         case 'u':
  184.         case 'U':
  185.         doit( ".--" );
  186.         break;
  187.  
  188.         case 'v':
  189.         case 'V':
  190.         doit( "...-" );
  191.         break;
  192.  
  193.         case 'w':
  194.         case 'W':
  195.         doit( ".--" );
  196.         break;
  197.  
  198.         case 'x':
  199.         case 'X':
  200.         doit( "-..-" );
  201.         break;
  202.  
  203.         case 'y':
  204.         case 'Y':
  205.         doit( "-.--" );
  206.         break;
  207.  
  208.         case 'z':
  209.         case 'Z':
  210.         doit( "--.." );
  211.         break;
  212.  
  213.         case '1':
  214.         doit( ".----" );
  215.         break;
  216.  
  217.         case '2':
  218.         doit( "..---" );
  219.         break;
  220.  
  221.         case '3':
  222.         doit( "...--" );
  223.         break;
  224.  
  225.         case '4':
  226.         doit( "....-" );
  227.         break;
  228.  
  229.         case '5':
  230.         doit( "....." );
  231.         break;
  232.  
  233.         case '6':
  234.         doit( "-...." );
  235.         break;
  236.  
  237.         case '7':
  238.         doit( "--..." );
  239.         break;
  240.  
  241.         case '8':
  242.         doit( "---.." );
  243.         break;
  244.  
  245.         case '9':
  246.         doit( "----." );
  247.         break;
  248.  
  249.         case '0':
  250.         doit( "-----" );
  251.         break;
  252.  
  253.         case '.':
  254.         doit( ".-.-.-" );
  255.         break;
  256.  
  257.         case ',':
  258.         doit( "--..--" );
  259.         break;
  260.  
  261.         case '?':
  262.         doit( "..--.." );
  263.         break;
  264.  
  265.         case ':':
  266.         doit( "---..." );
  267.         break;
  268.  
  269.         case ';':
  270.         doit( "-.-.-." );
  271.         break;
  272.  
  273.         case ' ':
  274.         case '\t':
  275.         case '\n':
  276.         case '\r':
  277.         usleep( interword_usec );
  278.         break;
  279.         }
  280.     }
  281.  
  282.     sst_close( sst_fd );
  283.     exit( 0 );
  284.     }
  285.  
  286. doit( s )
  287. char *s;
  288.     {
  289.     for ( ; *s != '\0'; ++s )
  290.     {
  291.     if ( *s == '.' )
  292.         sst_tones( sst_fd, MORSE_HZ, 0, 0, 0, dot_usec );
  293.     else if ( *s == '-' )
  294.         sst_tones( sst_fd, MORSE_HZ, 0, 0, 0, dash_usec );
  295.     else
  296.         fprintf( stderr, "Say what?!?\n" );
  297.     usleep( intertone_usec );
  298.     }
  299.     usleep( interchar_usec );
  300.     }
  301.  
  302. int
  303. sighandler( )
  304.     {
  305.     sst_close( sst_fd );
  306.     exit( 1 );
  307.     }
  308.