#include #include #define ROMAJI_FOREIGN 1 #define ROMAJI_UNPRONOUNCEABLE 2 int is_romaji(const char *s, int flags) { int read_any = 0; while (*s != '\0') { if ((s[0] == 's' || s[0] == 'S' || s[0] == 'c' || s[0] == 'C') && (s[1] == 'h' || s[1] == 'H')) { if (s[2] != '\0' && (strchr("aiuoAIUO", s[2]) || ((flags & ROMAJI_FOREIGN) != 0 && (s[2] == 'e' || s[2] == 'E')))) s += 3; else break; } else if ((s[0] == 't' || s[0] == 'T') && (s[1] == 's' || s[1] == 'S') && (s[2] == 'u' || s[2] == 'u')) { s += 3; } else if (strchr("knhmrgbpKNHMRGBP", s[0]) && (s[1] == 'y' || s[1] == 'Y')) { if (s[2] != '\0' && strchr("auoAUO", s[2])) s += 3; else break; } else if (strchr("kstnhmyrwgzdbpfjKSTNHMYRWGZDBPFJ", s[0])) { if ((s[1] == 'i' || s[1] == 'I') && strchr("stzdSTZD", s[0]) && (flags & ROMAJI_FOREIGN) == 0) { break; } else if ((s[1] == 'u' || s[1] == 'U') && strchr("tdTD", s[0]) && (flags & ROMAJI_FOREIGN) == 0) { break; } else if ((s[0] == 'h' || s[0] == 'H') && (s[1] == 'u' || s[1] == 'U')) { break; } else if ((s[0] == 'y' || s[0] == 'Y') && (s[1] == '\0' || strchr("ieIE", s[1]))) { break; } else if ((s[0] == 'w' || s[0] == 'W') && (s[1] == '\0' || s[1] == 'u' || s[1] == 'U' || ((flags & ROMAJI_FOREIGN) == 0 && strchr("ieoIEO", s[1])))) { break; } else if ((s[0] == 'f' || s[0] == 'F') && (s[1] == '\0' || ((flags & ROMAJI_FOREIGN) == 0 && strchr("aieoAIEO", s[1])))) { break; } else if ((flags & ROMAJI_FOREIGN) == 0 && (s[0] == 'j' || s[0] == 'J') && (s[1] == 'e' || s[1] == 'E')) { break; } else if (s[1] != '\0' && strchr("aiueoAIUEO", s[1])) { s += 2; } else if (read_any && (s[0] == 'm' || s[0] == 'M') && s[1] != '\0' && strchr("bmpBMP", s[1])) { s++; } else if (read_any && (s[0] == 'n' || s[0] == 'N') && (s[1] == '\0' || !strchr("bmpBMP", s[1])) && ((flags & ROMAJI_UNPRONOUNCEABLE) != 0 || (s[-1] != 'n' && s[-1] != 'N'))) { s++; } else if (read_any && (s[0] == 't' || s[0] == 'T') && (s[1] == 'c' || s[1] == 'C') && (s[2] == 'h' || s[2] == 'H')) { s++; } else if (read_any && s[0] == s[1] && ((flags & ROMAJI_UNPRONOUNCEABLE) != 0 || (strchr("kstpKSTP", s[0]) && s[-1] != s[0] && s[-1] != 'h' && s[-1] != 'H' && s[-1] != 'n' && s[-1] != 'N' && s[-1] != 'm' && s[-1] != 'M'))) { s++; } else if (read_any && (s[-1] == 'o' || s[-1] == 'O') && (s[0] == 'h' || s[0] == 'H')) { s++; } else { break; } } else if (strchr("aiueoAIUEO", s[0])) { s++; } else break; read_any = 1; } return *s == '\0'; } #ifdef MAIN int main(int argc, char **argv) { for (++argv; *argv; argv++) if (is_romaji(*argv, 0)) printf("%s\n", *argv); return 0; } #endif