/* morse.c
 * by Mogens Beltoft
 * 2006-12-26
 *
 * This program opens a file named morse.txt
 * and deciphers morse letters into normal letters.
 *
 * The format of the file is:
 * .../---/...//
 * '/' is used as a delimiter between morse letters.
 */

#include <stdio.h>
#include <stdlib.h>

/* Decode one morse letter to one capital letter */
char decodeMorseLetter(char *buffer) {
    char result = '\0';

    if (buffer == NULL)
        return result;

    if (0 == strcmp(buffer, ".-"))
        result = 'A';
    if (0 == strcmp(buffer, "-..."))
        result = 'B';
    if (0 == strcmp(buffer, "-.-."))
        result = 'C';
    if (0 == strcmp(buffer, "-.."))
        result = 'D';
    if (0 == strcmp(buffer, "."))
        result = 'E';
    if (0 == strcmp(buffer, "..-."))
        result = 'F';
    if (0 == strcmp(buffer, "--."))
        result = 'G';
    if (0 == strcmp(buffer, "...."))
        result = 'H';
    if (0 == strcmp(buffer, ".."))
        result = 'I';
    if (0 == strcmp(buffer, ".---"))
        result = 'J';
    if (0 == strcmp(buffer, "-.-"))
        result = 'K';
    if (0 == strcmp(buffer, ".-.."))
        result = 'L';
    if (0 == strcmp(buffer, "--"))
        result = 'M';
    if (0 == strcmp(buffer, "-."))
        result = 'N';
    if (0 == strcmp(buffer, "---"))
        result = 'O';
    if (0 == strcmp(buffer, ".--."))
        result = 'P';
    if (0 == strcmp(buffer, "--.-"))
        result = 'Q';
    if (0 == strcmp(buffer, ".-."))
        result = 'R';
    if (0 == strcmp(buffer, "..."))
        result = 'S';
    if (0 == strcmp(buffer, "-"))
        result = 'T';
    if (0 == strcmp(buffer, "..-"))
        result = 'U';
    if (0 == strcmp(buffer, "...-"))
        result = 'V';
    if (0 == strcmp(buffer, ".--"))
        result = 'W';
    if (0 == strcmp(buffer, "-..-"))
        result = 'X';
    if (0 == strcmp(buffer, "-.--"))
        result = 'Y';
    if (0 == strcmp(buffer, "--.."))
        result = 'Z';

    if (0 == strcmp(buffer, "-----"))
        result = '0';
    if (0 == strcmp(buffer, ".----"))
        result = '1';
    if (0 == strcmp(buffer, "..---"))
        result = '2';
    if (0 == strcmp(buffer, "...--"))
        result = '3';
    if (0 == strcmp(buffer, "....-"))
        result = '4';
    if (0 == strcmp(buffer, "....."))
        result = '5';
    if (0 == strcmp(buffer, "-...."))
        result = '6';
    if (0 == strcmp(buffer, "--..."))
        result = '7';
    if (0 == strcmp(buffer, "---.."))
        result = '8';
    if (0 == strcmp(buffer, "----."))
        result = '9';

    if (0 == strcmp(buffer, ".-.-"))
        result = 'Æ';
    if (0 == strcmp(buffer, "---."))
        result = 'Ø';
    if (0 == strcmp(buffer, ".--.-"))
        result = 'Å';

    if (0 == strcmp(buffer, ".-.-.-"))
        result = '.';
    if (0 == strcmp(buffer, "--..--"))
        result = ',';
    if (0 == strcmp(buffer, "..--.."))
        result = '?';

    return result;
}

int main(int argc, char *argv[])
{
    FILE *fp = NULL;
    char buffer[10];
    int index = 0;
    char ch;

    memset(buffer, 0, sizeof(buffer));
    fp = fopen("morse.txt", "r+"); /* open morse.txt for reading */
    if (fp != NULL) {
        while((ch = getc(fp)) != EOF) {
            if (ch == '.' || ch == '-') {
                /* collect dashes and dots to one morse code letter */
                buffer[index++] = ch;
            } else {
                if (ch == '/') {
                    /* translate dashes and dots in one morse code letter */
                    printf("%c", decodeMorseLetter(buffer));
                    /* reset buffer */
                    memset(buffer, 0, sizeof(buffer));
                    index = 0;
                } else {
                    if (isascii(ch))
                        printf("%c", ch); /* normal letters */
                    else if (ch == '\n')
                        printf("\n");
                    else if ((unsigned char)ch == 176)
                        printf("%c", 248); /* degrees */
                    else if ((unsigned char)ch == 148)
                        printf("\""); /* double quote */
                    else if ((unsigned char)ch == 147)
                        printf("\""); /* double quote */
                    else
                        printf("<%d>", (unsigned char)ch); /* unknown letters */
                }
            }
        }
        fclose(fp); /* close file */
    } else {
        printf("Could not open morse.txt\n");
    }

    return 0;
}

