|
#import <Foundation/Foundation.h> |
|
|
|
int main(int argc, const char * argv[]) { |
|
@autoreleasepool { |
|
|
|
if (argc <= 1) { |
|
fputs("ERROR: no arguments\n", stderr); |
|
return 1; |
|
} |
|
|
|
// コマンドライン引数で与えられた各引数をひらがなに直してスペース区切りで出力 |
|
for (int i = 1; i < argc; i++){ |
|
NSString *input = [NSString stringWithUTF8String: argv[i]]; // 第i引数文字列 |
|
|
|
CFRange range = CFRangeMake(0, [input length]); |
|
|
|
//(現在のユーザの言語環境によらず)日本語ロカールを生成 |
|
CFLocaleIdentifier jaLocaleIdentifier = CFLocaleCreateCanonicalLanguageIdentifierFromString(kCFAllocatorDefault, CFSTR("ja")); |
|
CFLocaleRef locale = CFLocaleCreate(kCFAllocatorDefault, jaLocaleIdentifier); |
|
|
|
// tokenizer を生成 |
|
CFStringTokenizerRef tokenizer = CFStringTokenizerCreate(kCFAllocatorDefault, (CFStringRef)input, range, kCFStringTokenizerUnitWordBoundary, locale); |
|
CFStringTokenizerTokenType tokenType = CFStringTokenizerGoToTokenAtIndex(tokenizer, 0); // 冒頭位置にセット |
|
|
|
NSMutableString *result = [NSMutableString string]; // 出力された形態素のひらがなをつないで収録していく |
|
|
|
// 形態素解析を実行 |
|
while (tokenType != kCFStringTokenizerTokenNone) { |
|
CFTypeRef latin = CFStringTokenizerCopyCurrentTokenAttribute(tokenizer, kCFStringTokenizerAttributeLatinTranscription); // 現トークンの読みをローマ字に起こす |
|
|
|
NSString *hiragana = [[NSString stringWithFormat:@"%@", latin] stringByApplyingTransform:NSStringTransformLatinToHiragana reverse:NO]; // ローマ字をひらがなに変換 |
|
CFRelease(latin); |
|
|
|
[result appendString:hiragana]; // 変換結果を追加 |
|
tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer); // 次のトークンへ |
|
} |
|
|
|
// メモリ解放 |
|
CFRelease(tokenizer); |
|
CFRelease(locale); |
|
CFRelease(jaLocaleIdentifier); |
|
|
|
fputs([result UTF8String], stdout); // 標準出力へ |
|
putchar((i+1 < argc) ? ' ' : '\n'); // スペース区切りで出力 |
|
} |
|
} |
|
|
|
return 0; |
|
} |