■ パス操作関数(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