/* Copyright (C)1995-2000 ASH multimedia lab. (http://ash.jp/) */ /******************************/ /* 文字コードチェックコマンド */ /******************************/ #include #include #include #define MAXBUF 65535 char prog_name[64]; int dbg; /* 使用方法の表示 */ usage() { printf("Usage: %s [option] files\n", prog_name); printf(" options: オプション\n"); printf(" -a: ASCIIコードとしてチェック\n"); printf(" -j: JISコードとしてチェック\n"); printf(" -s: ShiftJISコードとしてチェック\n"); printf(" -e: EUCコードとしてチェック\n"); printf(" -d: 機種依存文字チェック\n"); printf(" files: チェックファイル名\n"); exit(-1); } /* メイン処理 */ main(argc, argv) int argc; char *argv[]; { int mode = 0; /* 機種依存チェックモード */ int code = 3; /* EUC */ FILE *fp; int rtn; while ((rtn = getopt(argc, argv, "dajsex")) != -1) { switch(rtn) { /* オプション解析 */ case 'a': /* '-a' option (ascii code) */ code = 0; break; case 'j': /* '-j' option (jis code) */ code = 1; break; case 's': /* '-s' option (sjis code) */ code = 2; break; case 'e': /* '-e' option (euc code) */ code = 3; break; case 'd': /* '-d' option (depend check mode) */ mode = 1; break; case 'x': /* '-x' option (debug mode) */ code = 3; break; default: /* 使用方法の表示 */ usage(); } } /* 入力ファイルのオープン */ if (argv[optind] != NULL) { for (; argv[optind] != NULL; optind++) { if (isdir(argv[optind])) {continue;} printf ("%s:", argv[optind]); fp = fopen (argv[optind], "r"); if (!fp) { printf("File open error.\n"); continue; } printf ("\n"); _chkcode(mode, code, fp); fclose(fp); } } else { /* 指定なしの場合、標準入力 */ _chkcode(mode, code, stdin); } } _chkcode(mode, code, fp) int mode; int code; FILE *fp; { char buf[MAXBUF+1]; int rtn, len, line; for (line = 1; ; line++) { if (!fgets(buf, MAXBUF, fp)) {break;} if (ferror(fp)) { perror("Read error"); exit(1); } len = strlen(buf); if (code == 0) { rtn = chkasc(buf, len); } else if (code == 1) { rtn = chkjis(buf, len); } else if (code == 2) { rtn = chksjis(buf, len); } else { rtn = chkeuc(buf, len); } if (rtn < 0) { printf("%08d: 不正文字 exists. (%d)\n", line, rtn); printf("%s\n", buf); } else if (mode == 1) { /* 機種依存チェック */ if (rtn & 8) { printf("%08d: 機種依存文字 exists. (%d)\n", line, rtn); printf("%s\n", buf); } else if (rtn & 4) { printf("%08d: NEC拡張外字 exists. (%d)\n", line, rtn); printf("%s\n", buf); } } } }