Last Update: Nov.19,2006

C Source Library

「LSI C-86 Ver.3.30c 試食版」、「Borland C++ 5.5」でコンパイル出来ます。

■ パス操作関数(misc.h)

/*  MISC.H
 *
 *  2000.04.14 - 初版
 *  2000.04.15 - 2版
 *  2002.07. 7 - 3版
 *  2002.07.24 - 4版
 *  2006.11.19 - 5版
 *
 *  Copyright (c) 2000-2002, 2006 AOK.
 */

#ifndef __MISC_H__
    #define __MISC_H__

#include <stdio.h>
#include <string.h>

#define MAXCMD  128

#define IS_SJIS_KANJI1(c) \
    ( ( (unsigned char)(c) >= 0x81 && (unsigned char)(c) <= 0x9F ) \
   || ( (unsigned char)(c) >= 0xE0 && (unsigned char)(c) <= 0xFC ) )
#define IS_SJIS_KANJI2(c) \
    ( ( (unsigned char)(c) >= 0x40 && (unsigned char)(c) <= 0x7E ) \
   || ( (unsigned char)(c) >= 0x80 && (unsigned char)(c) <= 0xFC ) )

/*  シフト JIS の 2 バイト目かどうかテストする
 *
 *  【引数】
 *  s ---- 走査したい文字列へのポインタ
 *  n ---- テストする文字の位置(先頭は 0 )
 *
 *  【戻り値】
 *  真で 1 、偽で 0 を返す
 */
int is_kanji2(const char *s, int n)
{
    int i, f = 0;
    if (!IS_SJIS_KANJI2(*(s+n))) return 0;
    for (i = 0; i < n; i++) {
        if (f == 0 && IS_SJIS_KANJI1(*(s+i))) {
            f = 1;
            continue;
        }
        f = 0;
    }
    return f;
}

/*  拡張子の位置を検索
 *
 *  【引数】
 *  path ---- 検索する拡張子を含むパスへのポインタ
 *
 *  【戻り値】
 *  拡張子を見つけた場合は、path 内での拡張子直前の "." のアドレス
 *  それ以外の場合は、最後の NULL 文字へのアドレス
 */
char *find_ext(char *path)
{
    int i, n;
    n = strlen(path);
    if (n > 0) {
        for (i = n - 1; i >= 0; i--) {
            if (*(path+i) == '.')
                return path+i;
            else if ((*(path+i) == '\\' && is_kanji2(path, i) == 0)
                    || (*(path+i) == ':'))
                break;
        }
    }
    return path+n;
}

/*  拡張子を変更する
 *
 *  【引数】
 *  buf ---- 拡張子を変更したファイル名を受け取るバッファ
 *  path --- フルパス名
 *  ext ---- 変更したい拡張子
 *
 *  【戻り値】
 *  引数で指定したバッファへのポインタ
 */
char *change_ext(char *buf, const char *path, const char *ext)
{
    char *p;
    strcpy(buf, path);
    p = find_ext(buf);  
    if (*ext == '.') {
        strcpy(p, ext);
    } else {
        strcpy(p, ".");
        strcpy(p+1, ext);
    }
    return buf;
}

/*  フルパスからファイル名を取り除く
 *
 *  【引数】
 *  buf ---- ファイル名を削除したあとのパス名
 *  path --- フルパス名
 *
 *  【戻り値】
 *  引数で指定したバッファへのポインタ
 */
char *extract_path(char *buf, const char *path)
{
    int i, n, r = 0;
    n = strlen(path);
    for (i = 0; i < n; i++) {
        *(buf+i) = *(path+i);
        if (*(path+i) == '\\' || *(path+i) == ':') {
            r = i + 1;
        } else if (IS_SJIS_KANJI1(*(path+i))) {
            i++;
            *(buf+i) = *(path+i);
            if (*(path+i) == '\0') break;
        }
    }
    *(buf+r) = '\0';
    return buf;
}

/*  フルパスからパスを取り除く
 *
 *  【引数】
 *  buf ---- ファイル名を受け取るバッファ
 *  path --- フルパス名
 *
 *  【戻り値】
 *  引数で指定したバッファへのポインタ
 */
char *extract_filename(char *buf, const char *path)
{
    int i, n, r = 0;
    n = strlen(path);
    for (i = 0; i < n; i++) {
        if (*(path+i) == '\\' || *(path+i) == ':') {
            r = i + 1;
        } else if (IS_SJIS_KANJI1(*(path+i))) {
            i++;
            if (*(path+i) == '\0') break;
        }
    }
    strcpy(buf, path+r);
    return buf;
}

/*  ストリームから文字列を得る
 *
 *  【引数】
 *  buf ---- 文字列を受け取るバッファ
 *  size --- 最大文字数(バイト)
 *
 *  【注意】
 *  バッファ buf は size で指定するバイトより
 *  1 バイト以上大きく確保すること.
 */
void input(char *buf, int size)
{
    char temp[MAXCMD+1];
    int i;
    if (fgets(temp, MAXCMD+1, stdin) != NULL)
    {
        for (i = 0; temp[i] != '\0'; i++) {
            if (temp[i] == '\n') {
                temp[i] = '\0';
                break;
            }
        }
        strncpy(buf, temp, size);
        *(buf+size) = '\0';
    }
    else
        *buf = '\0';
}

#endif