■ ユニコードテキストの表示
/*
* a2w.c : ユニコードテキストの表示
*
* Copyright (c) 2002 AOK.
*
* 2002.04.05 - 初版
* 2002.07.26 - 2版
*
* 【使い方】a2w UNICODEテキストファイル名
*
* 出力をファイルにとりたいときは、
*
* a2w input.txt > output.txt
*
* のようにする。
*
*/
#include <stdio.h>
#include <stdlib.h>
#include "cp932.h"
#define B_ENDIAN 0
#define L_ENDIAN 1
const size_t table_size = sizeof(conv_table) / sizeof(CONVTABLE);
typedef int (*FPTR)(const void*, const void*);
int compare(CONVTABLE *a, CONVTABLE *b)
{
long r = a->unicode - b->unicode;
if (r == 0) return 0;
else if (r > 0) return 1;
return -1;
}
CONVTABLE *search(unsigned short *pw)
{
return (CONVTABLE *)bsearch(
pw, conv_table, table_size, sizeof(CONVTABLE), (FPTR)compare);
}
unsigned short unicode2sjis(unsigned short ucode)
{
CONVTABLE *ptr;
if ((ptr = search(&ucode)) == NULL) return 0;
return ptr->sjiscode;
}
int main(int argc, char *argv[])
{
FILE *fp;
int high, low;
unsigned short u, r;
int endian = B_ENDIAN;
/* 前処理 */
if (argc < 2) { /* error */ return 1; }
if ((fp = fopen(argv[1], "rb")) == NULL) { /* error */ return 1; }
/* Byte Order Mark のチェック */
if ((low = getc(fp)) == EOF) { fclose(fp); return 1; }
if ((high = getc(fp)) == EOF) { fclose(fp); return 1; }
u = high << 8 | low;
if (u == 0xFEFF) endian = L_ENDIAN;
else if (u == 0xFFFE) endian = B_ENDIAN;
else rewind(fp); /* BOM 無し */
/* 変換、表示 */
while ((low = getc(fp)) != EOF) {
if ((high = getc(fp)) == EOF) { putchar('?'); break; }
if (endian == L_ENDIAN) u = high << 8 | low;
else u = low << 8 | high;
r = unicode2sjis(u);
if (r == 0) printf("??");
else if (r == 0x0D) /* skip */;
else if (r & 0xFF00) printf("%c%c", r >> 8, r & 0xFF);
else printf("%c", r);
}
/* 後処理 */
fclose(fp);
return 0;
}