#include <stdlib.h>
#include <stdio.h>
#include <string.h>
static const unsigned char alpha_signal[] = {
/* 0 1 2 3 4 5 6 7 8 9 A B C D E */
0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x1, 0x1, 0x1, 0x0
};
static const unsigned char alpha_table[] = {
/* A B C D E F G H I J */
0x02, 0x34, 0x14, 0x33, 0x01, 0xE4, 0x83, 0x44, 0x42, 0xA4,
/* K L M N O P Q R S T */
0x13, 0x24, 0x82, 0x12, 0xB3, 0x74, 0x84, 0x03, 0x43, 0x11,
/* U V W X Y Z */
0x63, 0x54, 0x73, 0xD4, 0x94, 0xC4
};
static const unsigned char num_table[] = {
/* 0 1 2 3 4 5 6 7 8 9 */
0x01, 0x02, 0x03, 0x04, 0x05, 0x11, 0x12, 0x13, 0x14, 0x15
};
void num2morse(char c, char *buf) {
char m;
int i, n;
unsigned char v;
while (*buf != '\0') buf++;
v = num_table[c - '0'];
m = ((v & 0x10) == 0x00) ? '0' : '1';
for (i = 0, n = (v & 0x0F); i < n; i++) {
*buf++ = m;
}
m = ((v & 0x10) == 0x00) ? '1' : '0';
for (i = 0, n = 5 - (v & 0x0F); i < n; i++) {
*buf++ = m;
}
*buf++ = ' '; *buf = '\0';
}
void morse2num(char *buf, char *c) {
char m;
int i, n;
unsigned char v;
*c = '*';
m = buf[0];
n = 0;
while (*buf == m) buf++, n++;
v = ((m == '0') ? 0x00 : 0x10 ) | n;
for (i = 0; i < 10; i++) {
if (num_table[i] == v) {
*c = '0' + i;
break;
}
}
}
void alpha2morse(char c, char *buf) {
int i, j, n;
unsigned char v;
while (*buf != '\0') buf++;
v = alpha_table[c - 'A'];
j = (v & 0xF0) >> 4;
for (i = 0, n = (v & 0x0F); i < n; i++) {
*buf++ = (alpha_signal[j++ % 15] == 0x0) ? '0' : '1';
}
*buf++ = ' '; *buf = '\0';
}
void morse2alpha(char *buf, char *c) {
int i, j, k, n;
unsigned char v;
*c = '*';
for (i = 0; i < 15; i++) {
for (j = 0; j < n; j++) {
if (alpha_signal[(i + j) % 15] != (buf[j] - '0')) break;
}
if (j == n) {
v = (i << 4) | n;
for (k = 0; k < 26; k++) {
if (alpha_table[k] == v) break;
}
if (k != 26) *c = 'A' + k;
break;
}
}
}
int encode_morse(char *s) {
int i, n;
char c;
char buf[20];
char *p;
printf("[ENCODE]\n%s -> \n", s
); for (i
= 0, n
= strlen(s
); i
< n
; i
++) { buf[0] = '\0';
c = *s++;
if (c >= '0' && c <= '9') {
num2morse(c, buf);
} else {
if (c >= 'a' && c <= 'z') {
c += 'A' - 'a';
}
if (c >= 'A' && c <= 'Z') {
alpha2morse(c, buf);
}
}
for (p = &buf[0]; *p != '\0'; p++) {
switch (*p) {
}
}
}
}
int decode_morse(char *s) {
char buf[20];
char *p;
char c;
int i, n, m;
p = &buf[0];
printf("[DECODE]\n%s\n -> ", s
); for (i
= 0, n
= strlen(s
); i
< n
; ) { *p++ = '0';
*p++ = '1';
*p = '\0';
if (m > 0) {
if (m == 5) {
morse2num(buf, &c);
} else {
morse2alpha(buf, &c);
}
}
p = &buf[0];
} else {
break;
}
}
}
void main_part11_378(int argc, char *argv[]) {
if (strcmp(argv
[1], "encode") == 0) { encode_morse(argv[2]);
} else if (strcmp(argv
[1], "decode") == 0) { decode_morse(argv[2]);
}
}
int main(int argc, char *argv[]) {
char *argv1[] = {"", "encode", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"};
char *argv2[] = {"", "decode", "・---- ・・--- ・・・-- ・・・・- ・・・・・ -・・・・ --・・・ ---・・ ----・ ----- ・- -・・・ -・-・ -・・ ・ ・・-・ --・ ・・・・ ・・ ・--- -・- ・-・・ -- -・ --- ・--・ --・- ・-・ ・・・ - ・・- ・・・- ・-- -・・- -・-- --・・ "};
if (argc <= 2) {
main_part11_378(sizeof(argv1) / sizeof(char*), argv1);
main_part11_378(sizeof(argv2) / sizeof(char*), argv2);
} else {
main_part11_378(argc, argv);
}
return 0;
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhbHBoYV9zaWduYWxbXSA9IHsKICAgIC8qIDAgICAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICBBICAgIEIgICAgQyAgICBEICAgIEUgKi8KICAgIDB4MCwgMHgxLCAweDAsIDB4MSwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDEsIDB4MSwgMHgwLCAweDEsIDB4MSwgMHgxLCAweDAKfTsKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYWxwaGFfdGFibGVbXSA9IHsKICAgIC8qIEEgICAgIEIgICAgIEMgICAgIEQgICAgIEUgICAgIEYgICAgIEcgICAgIEggICAgIEkgICAgIEogKi8KICAgIDB4MDIsIDB4MzQsIDB4MTQsIDB4MzMsIDB4MDEsIDB4RTQsIDB4ODMsIDB4NDQsIDB4NDIsIDB4QTQsCiAgICAvKiBLICAgICBMICAgICBNICAgICBOICAgICBPICAgICBQICAgICBRICAgICBSICAgICBTICAgICBUICAqLwogICAgMHgxMywgMHgyNCwgMHg4MiwgMHgxMiwgMHhCMywgMHg3NCwgMHg4NCwgMHgwMywgMHg0MywgMHgxMSwgCiAgICAvKiBVICAgICBWICAgICAgVyAgICAgICBYICAgICAgIFkgICAgICAgWiAqLwogICAgMHg2MywgMHg1NCwgMHg3MywgMHhENCwgMHg5NCwgMHhDNAp9OwpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBudW1fdGFibGVbXSA9IHsKICAgIC8qIDAgICAgIDEgICAgIDIgICAgIDMgICAgIDQgICAgIDUgICAgIDYgICAgIDcgICAgIDggICAgIDkgKi8KICAgIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUKfTsKdm9pZCBudW0ybW9yc2UoY2hhciBjLCBjaGFyICpidWYpIHsKICAgIGNoYXIgbTsKICAgIGludCBpLCBuOwogICAgdW5zaWduZWQgY2hhciB2OwogICAgd2hpbGUgKCpidWYgIT0gJ1wwJykgYnVmKys7CiAgICB2ID0gbnVtX3RhYmxlW2MgLSAnMCddOwogICAgbSA9ICgodiAmIDB4MTApID09IDB4MDApID8gJzAnIDogJzEnOwogICAgZm9yIChpID0gMCwgbiA9ICh2ICYgMHgwRik7IGkgPCBuOyBpKyspIHsKICAgICAgICAqYnVmKysgPSBtOwogICAgfQogICAgbSA9ICgodiAmIDB4MTApID09IDB4MDApID8gJzEnIDogJzAnOwogICAgZm9yIChpID0gMCwgbiA9IDUgLSAodiAmIDB4MEYpOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgKmJ1ZisrID0gbTsKICAgIH0KICAgICpidWYrKyA9ICcgJzsgKmJ1ZiA9ICdcMCc7Cn0Kdm9pZCBtb3JzZTJudW0oY2hhciAqYnVmLCBjaGFyICpjKSB7CgljaGFyIG07CglpbnQgaSwgbjsKICAgIHVuc2lnbmVkIGNoYXIgdjsKICAgICpjID0gJyonOwogICAgbSA9IGJ1ZlswXTsKICAgIG4gPSAwOwogICAgd2hpbGUgKCpidWYgPT0gbSkgYnVmKyssIG4rKzsKICAgIHYgPSAoKG0gPT0gJzAnKSA/IDB4MDAgOiAweDEwICkgfCBuOwogICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKICAgICAgICBpZiAobnVtX3RhYmxlW2ldID09IHYpIHsKICAgICAgICAgICAgKmMgPSAnMCcgKyBpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0Kdm9pZCBhbHBoYTJtb3JzZShjaGFyIGMsIGNoYXIgKmJ1ZikgewogICAgaW50IGksIGosIG47CiAgICB1bnNpZ25lZCBjaGFyIHY7CiAgICB3aGlsZSAoKmJ1ZiAhPSAnXDAnKSBidWYrKzsKICAgIHYgPSBhbHBoYV90YWJsZVtjIC0gJ0EnXTsKICAgIGogPSAodiAmIDB4RjApID4+IDQ7CiAgICBmb3IgKGkgPSAwLCBuID0gKHYgJiAweDBGKTsgaSA8IG47IGkrKykgewogICAgICAgICpidWYrKyA9IChhbHBoYV9zaWduYWxbaisrICUgMTVdID09IDB4MCkgPyAnMCcgOiAnMSc7CiAgICB9CiAgICAqYnVmKysgPSAnICc7ICpidWYgPSAnXDAnOwp9CnZvaWQgbW9yc2UyYWxwaGEoY2hhciAqYnVmLCBjaGFyICpjKSB7CiAgICBpbnQgaSwgaiwgaywgbjsKICAgIHVuc2lnbmVkIGNoYXIgdjsKICAgICpjID0gJyonOwogICAgbiA9IHN0cmxlbihidWYpOwogICAgZm9yIChpID0gMDsgaSA8IDE1OyBpKyspIHsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgaisrKSB7CiAgICAgICAgICAgIGlmIChhbHBoYV9zaWduYWxbKGkgKyBqKSAlIDE1XSAhPSAoYnVmW2pdIC0gJzAnKSkgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChqID09IG4pIHsKICAgICAgICAgICAgdiA9IChpIDw8IDQpIHwgbjsKICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDI2OyBrKyspIHsKICAgICAgICAgICAgICAgIGlmIChhbHBoYV90YWJsZVtrXSA9PSB2KSBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoayAhPSAyNikgKmMgPSAnQScgKyBrOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0KaW50IGVuY29kZV9tb3JzZShjaGFyICpzKSB7CiAgICBpbnQgaSwgbjsKICAgIGNoYXIgYzsKICAgIGNoYXIgYnVmWzIwXTsKICAgIGNoYXIgKnA7CiAgICBwcmludGYoIltFTkNPREVdXG4lcyAtPiBcbiIsIHMpOwogICAgZm9yIChpID0gMCwgbiA9IHN0cmxlbihzKTsgaSA8IG47IGkrKykgewogICAgCWJ1ZlswXSA9ICdcMCc7CiAgICAgICAgYyA9ICpzKys7CiAgICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7CiAgICAgICAgICAgIG51bTJtb3JzZShjLCBidWYpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgewogICAgICAgICAgICAgICAgYyArPSAnQScgLSAnYSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7CiAgICAgICAgICAgICAgICBhbHBoYTJtb3JzZShjLCBidWYpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAocCA9ICZidWZbMF07ICpwICE9ICdcMCc7IHArKykgewogICAgICAgICAgICBzd2l0Y2ggKCpwKSB7CiAgICAgICAgICAgIGNhc2UgJzAnOiBwcmludGYoIuODuyIpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnMSc6IHByaW50Zigi77yNIik7IGJyZWFrOwogICAgICAgICAgICBjYXNlICcgJzogcHJpbnRmKCLjgIDjgIDjgIAiKTsgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBwcmludGYoIlxuIik7Cn0KaW50IGRlY29kZV9tb3JzZShjaGFyICpzKSB7CiAgICBjaGFyIGJ1ZlsyMF07CiAgICBjaGFyICpwOwogICAgY2hhciBjOwogICAgaW50IGksIG4sIG07CiAgICBwID0gJmJ1ZlswXTsKICAgIHByaW50ZigiW0RFQ09ERV1cbiVzXG4gLT4gIiwgcyk7CiAgICBmb3IgKGkgPSAwLCBuID0gc3RybGVuKHMpOyBpIDwgbjsgKSB7CiAgICAgICAgaWYgKHN0cm5jbXAoJnNbaV0sICLjg7siLCBzdHJsZW4oIuODuyIpKSA9PSAwKSB7CiAgICAgICAgICAgICpwKysgPSAnMCc7CiAgICAgICAgICAgIGkgKz0gc3RybGVuKCLjg7siKTsKICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAoJnNbaV0sICLvvI0iLCBzdHJsZW4oIu+8jSIpKSA9PSAwKSB7CiAgICAgICAgICAgICpwKysgPSAnMSc7CiAgICAgICAgICAgIGkgKz0gc3RybGVuKCLvvI0iKTsKICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAoJnNbaV0sICLjgIAiLCBzdHJsZW4oIuOAgCIpKSA9PSAwKSB7CiAgICAgICAgCSpwID0gJ1wwJzsKICAgICAgICAJbSA9IHN0cmxlbihidWYpOwogICAgICAgIAlpZiAobSA+IDApIHsKICAgICAgICAJICAgIGlmIChtID09IDUpIHsKICAgICAgICAJICAgIAltb3JzZTJudW0oYnVmLCAmYyk7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlYyIsIGMpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtb3JzZTJhbHBoYShidWYsICZjKTsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVjIiwgYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcCA9ICZidWZbMF07CiAgICAgICAgICAgIGkgKz0gc3RybGVuKCLjgIAiKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICBwcmludGYoIlxuIik7Cn0Kdm9pZCBtYWluX3BhcnQxMV8zNzgoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICAgaWYgKHN0cmNtcChhcmd2WzFdLCAiZW5jb2RlIikgPT0gMCkgewogICAgICAgIGVuY29kZV9tb3JzZShhcmd2WzJdKTsKICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJkZWNvZGUiKSA9PSAwKSB7CiAgICAgICAgZGVjb2RlX21vcnNlKGFyZ3ZbMl0pOwogICAgfQp9CmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgIGNoYXIgKmFyZ3YxW10gPSB7IiIsICJlbmNvZGUiLCAiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIn07CiAgICBjaGFyICphcmd2MltdID0geyIiLCAiZGVjb2RlIiwgIuODu++8je+8je+8je+8jeOAgOOAgOOAgOODu+ODu++8je+8je+8jeOAgOOAgOOAgOODu+ODu+ODu++8je+8jeOAgOOAgOOAgOODu+ODu+ODu+ODu++8jeOAgOOAgOOAgOODu+ODu+ODu+ODu+ODu+OAgOOAgOOAgO+8jeODu+ODu+ODu+ODu+OAgOOAgOOAgO+8je+8jeODu+ODu+ODu+OAgOOAgOOAgO+8je+8je+8jeODu+ODu+OAgOOAgOOAgO+8je+8je+8je+8jeODu+OAgOOAgOOAgO+8je+8je+8je+8je+8jeOAgOOAgOOAgOODu++8jeOAgOOAgOOAgO+8jeODu+ODu+ODu+OAgOOAgOOAgO+8jeODu++8jeODu+OAgOOAgOOAgO+8jeODu+ODu+OAgOOAgOOAgOODu+OAgOOAgOOAgOODu+ODu++8jeODu+OAgOOAgOOAgO+8je+8jeODu+OAgOOAgOOAgOODu+ODu+ODu+ODu+OAgOOAgOOAgOODu+ODu+OAgOOAgOOAgOODu++8je+8je+8jeOAgOOAgOOAgO+8jeODu++8jeOAgOOAgOOAgOODu++8jeODu+ODu+OAgOOAgOOAgO+8je+8jeOAgOOAgOOAgO+8jeODu+OAgOOAgOOAgO+8je+8je+8jeOAgOOAgOOAgOODu++8je+8jeODu+OAgOOAgOOAgO+8je+8jeODu++8jeOAgOOAgOOAgOODu++8jeODu+OAgOOAgOOAgOODu+ODu+ODu+OAgOOAgOOAgO+8jeOAgOOAgOOAgOODu+ODu++8jeOAgOOAgOOAgOODu+ODu+ODu++8jeOAgOOAgOOAgOODu++8je+8jeOAgOOAgOOAgO+8jeODu+ODu++8jeOAgOOAgOOAgO+8jeODu++8je+8jeOAgOOAgOOAgO+8je+8jeODu+ODu+OAgOOAgOOAgCJ9OwogICAgaWYgKGFyZ2MgPD0gMikgewogICAgICAgIG1haW5fcGFydDExXzM3OChzaXplb2YoYXJndjEpIC8gc2l6ZW9mKGNoYXIqKSwgYXJndjEpOwogICAgICAgIG1haW5fcGFydDExXzM3OChzaXplb2YoYXJndjIpIC8gc2l6ZW9mKGNoYXIqKSwgYXJndjIpOwogICAgfSBlbHNlIHsKICAgICAgICBtYWluX3BhcnQxMV8zNzgoYXJnYywgYXJndik7CiAgICB9CiAgICByZXR1cm4gMDsKfQo=