Last Update: May.15,2003

C Source Library

「Borland C++ 5.5」でコンパイル出来ます。

■ 機種依存文字を検索する

/*
 *  kscan.c : 機種依存文字を検索する
 *
 *  Copyright (c) 2003 AOK. 
 *
 *      2003.05.14 - 初版
 *      2003.05.15 - 2版
 *
 *  KSCAN.EXE のあるフォルダ内の HTML ファイルをスキャン
 *
 */

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <mbstring.h>
#include <mbctype.h>

FILE *fp = NULL;
FILE *fo = NULL;
char filename[512] = { 0 };
HANDLE hFind;
WIN32_FIND_DATA fd;

void kscan(void)
{
    unsigned char c, k;
    int type = _MBC_SINGLE, ch, n;  
    while ((ch = getc(fp)) != EOF) {
        c = (unsigned char)ch;
        type = _mbbtype(c ,type);
        switch (type)
        {
        case _MBC_SINGLE:
            /* 半角カナ文字 */
            if (c >= 0xA0)
                fprintf(fo, "%c", c);
            break;
        case _MBC_LEAD:
            k = c;
            break;
        case _MBC_TRAIL:
            n = (k << 8) | c;
            /* 特殊文字 */
            if (n >= 0x8540 && n <= 0x889E)
                fprintf(fo, "%c%c", k, c);
            /* 特殊外字 */
            else if (n >= 0xEB40 && n <= 0xEFFC)
                fprintf(fo, "%c%c", k, c);
            /* 外字エリア */
            else if (n >= 0xF040)
                fprintf(fo, "%c%c", k, c);
            break;
        default:
            break;
        }
    }
}

int main()
{
    fo = fopen("kscan.log", "wt");
    if (fo == NULL) {
        fprintf(stderr, "エラー: ログが出力できません.");
        return 1;
    }
    
    /* 最初のファイル検索 */
    hFind = FindFirstFile("*.htm", &fd);
    
    /* 検索失敗 */
    if (hFind == INVALID_HANDLE_VALUE) {
        fprintf(stderr, "エラー: 検索に失敗しました.");
        return 1;
    }

    puts("KSCAN *** Copyright (c) 2003 AOK. ***");
    puts("検索中");
    
    do {
        strcpy(filename, fd.cFileName);
        fprintf(fo, "[%s] ", filename);
        if ((fp = fopen(filename, "rt")) != NULL) {
            putchar('.');
            kscan();
            fputc('\n', fo);
            fclose(fp);
        } else {
            fputs("エラー: ファイルがオープン出来ません.", fo);
        }
    } while (FindNextFile(hFind, &fd)); 

    /* 検索終了 */
    FindClose(hFind);
    fclose(fo); 
    puts("\n検索を終了しました.");
    
    return 0;
}