📄 my_sp.c
字号:
/ ? " を削除しつつ
/ ? / を \ に変換しつつ(Win32API では / も \ と同等に扱われるから)
/ ?最大 ( _MAX_PATH -1 ) 文字まで
/ po にコピーする。 */
for( pw=po,cnt=0 ; ( *pi != '\0' ) && ( cnt < _MAX_PATH -1 ) ; pi++ ){
/* /," 共に Shift_JIS の漢字コード中には含まれないので Shift_JIS 判定は不要。 */
if( *pi == '\"' ) continue; /* " なら何もしない。次の文字へ */
if( *pi == '/' ) *pw++ = '\\'; /* / なら \ に変換してコピー */
else *pw++ = *pi; /* その他の文字はそのままコピー */
cnt++; /* コピーした文字数 ++ */
}
*pw = '\0'; /* 文字列終端 */
#ifdef LSI_C /* LSI-C の場合のみ */
/* 準備ができていません 読み取り中 ドライブ X:
中止(A), 再試行(R), 失敗(F)?
を出さないようにする。 */
int24h = _dos_getvect(0x24); /* 割込みベクタ待避 */
_dos_setvect(0x24,int_nop); /* 何もしない処理に入れ替える */
#endif /* LSI_C */
dl = GetExistPath_NO_DriveLetter; /*「ドライブレターが無い」にしておく*/
if(
( *(po+1) == ':' )&&
(
( ( *po >='A' )&&( *po <='Z' ) ) ||
( ( *po >='a' )&&( *po <='z' ) )
)
){ /* 先頭にドライブレターがある。そのドライブが有効かどうか判定する */
drv[0] = *po;
/* printf("chk>{%s}\n",drv); /* for DEBUG */
if( access(drv,0) == 0 ) dl = GetExistPath_AV_Drive; /* 有効 */
else dl = GetExistPath_IV_Drive; /* 無効 */
}
#ifdef LSI_C /* LSI-C の場合のみ */
_dos_setvect(0x24,int24h); /* 割込みベクタ復活 */
#endif /* LSI_C */
if( dl == GetExistPath_IV_Drive ){ /* ドライブ自体が無効 */
/* フロッピーディスク中のファイルが指定されていて、
そのドライブにフロッピーディスクが入っていない、とか */
*po = '\0'; /* 返値文字列 = "";(空文字列) */
return; /* これ以上何もしない */
}
/* ps = 検索開始位置 */
ps = po; /* ↓文字列の先頭が \\ なら、\ 検索処理の対象から外す */
if( ( *po == '\\' )&&( *(po+1) == '\\' ) ) ps +=2;
if( *ps == '\0' ){ /* 検索対象が空文字列なら */
*po = '\0'; /* 返値文字列 = "";(空文字列) */
return; /*これ以上何もしない */
}
for(;;){
/* printf("chk>{%s}\n",po); /* for DEBUG */
if( access(po,0) == 0 ) break; /* 有効なパス文字列が見つかった */
/* ↓文字列最後尾の \ または ' ' を探し出し、そこを文字列終端にする。*/
pw = sjis_strrchr2(ps,'\\',' '); /* 最末尾の \ か ' ' を探す。 */
if ( pw == NULL ){ /* 文字列中に '\\' も ' ' も無かった */
/* 例えば "C:testdir" という文字列が来た時に、"C:testdir" が実在
しなくとも C:ドライブが有効なら "C:" という文字列だけでも返し
たい。以下↓は、そのための処理。 */
if( dl == GetExistPath_AV_Drive ){
/* 先頭に有効なドライブのドライブレターがある。 */
*(po+2) = '\0'; /* ドライブレター部の文字列のみ返す */
}
else{ /* 有効なパス部分が全く見つからなかった */
*po = '\0'; /* 返値文字列 = "";(空文字列) */
}
break; /* ループを抜ける */
}
/* ↓ルートディレクトリを引っかけるための処理 */
if( ( *pw == '\\' )&&( *(pw-1) == ':' ) ){ /* C:\ とかの \ っぽい */
* (pw+1) = '\0'; /* \ の後ろの位置を文字列の終端にする。 */
/* printf("chk>{%s}\n",po); /* for DEBUG */
if( access(po,0) == 0 ) break; /* 有効なパス文字列が見つかった */
}
*pw = '\0'; /* \ か ' ' の位置を文字列の終端にする。 */
/* ↓末尾がスペースなら、スペースを全て削除する */
while( ( pw != ps ) && ( *(pw-1) == ' ' ) ) * --pw = '\0';
}
return;
}
/* 与えられたコマンドライン文字列の先頭部分から実在するファイル?ディレクトリ
のパス文字列を抽出し、そのパスを分解して drv dir fnm ext に書き込む。
先頭部分に有効なパス名が存在しない場合、全てに空文字列が返る。 */
void my_splitpath ( const char *comln , char *drv,char *dir,char *fnm,char *ext ){
char ppp[_MAX_PATH]; /* パス格納(作業用) */
unsigned char *pd;
unsigned char *pf;
unsigned char *pe;
unsigned char ch;
#ifdef _USE_MS_DOS_FUNC_
unsigned attr;
#else
DWORD attr;
#endif
int a_dir;
if( drv != NULL ) *drv = '\0';
if( dir != NULL ) *dir = '\0';
if( fnm != NULL ) *fnm = '\0';
if( ext != NULL ) *ext = '\0';
if( *comln == '\0' ) return;
/* コマンドライン先頭部分の実在するパス名を ppp に書き出す。 */
GetExistPath( ppp , comln );
if( *ppp != '\0' ) { /* ファイル?ディレクトリが存在する場合 */
/* 先頭文字がドライブレターかどうか判定し、
pd = ディレクトリ名の先頭位置に設定する。 */
pd = ppp;
if(
( *(pd+1)==':' )&&
( ( ( *pd >='A' )&&( *pd <='Z' ) ) || ( ( *pd >='a' )&&( *pd <='z' ) ) )
){ /* 先頭にドライブレターがある。 */
pd += 2; /* pd = ドライブレター部の後ろ */
} /* ( = ディレクトリ名の先頭位置 ) */
/* ここまでで、pd = ディレクトリ名の先頭位置 */
#ifdef _USE_MS_DOS_FUNC_
_dos_getfileattr(ppp,&attr);
a_dir = ( attr & _A_SUBDIR ) ? 1 : 0;
#else
attr = GetFileAttributes(ppp);
a_dir = ( attr & FILE_ATTRIBUTE_DIRECTORY ) ? 1 : 0;
#endif
/* if( a_dir ) printf("find>{%s} <DIR>\n",ppp); /* for DEBUG */
/* else printf("find>{%s} <FILE>\n",ppp); /* for DEBUG */
if( ! a_dir ){ /* 見つけた物がファイルだった場合。 */
pf = sjis_strrchr2(ppp,'\\','\\'); /* 最末尾の \ を探す。 */
if(pf != NULL) pf++; /* 見つかった→ pf=\の次の文字の位置*/
else pf = pd; /* 見つからない→pf=パス名の先頭位置 */
/* ここまでで pf = ファイル名の先頭位置 */
pe = sjis_strrchr2(pf,'.','.'); /* 最末尾の '.' を探す。 */
if( pe != NULL ){ /* 見つかった(pe = '.'の位置)*/
if( ext != NULL ){ /* 拡張子を返値として書き込む。 */
strncpy(ext,pe,_MAX_EXT -1);
ext[_MAX_EXT -1] = '\0';
}
*pe = '\0'; /* 区切り位置を文字列終端にする。pe = 拡張子名の先頭位置。 */
}
if( fnm != NULL ){ /* ファイル名を返値として書き込む。 */
strncpy(fnm,pf,_MAX_FNAME -1);
fnm[_MAX_FNAME -1] = '\0';
}
*pf = '\0'; /* ファイル名の先頭位置を文字列終端にする。 */
}
/* ここまでで文字列 ppp はドライブレター+ディレクトリ名のみになっている */
if( dir != NULL ){
/* ディレクトリ名の最後の文字が \ ではない場合、\ にする。 */
/* ↓最後の文字を ch に得る。(ディレクトリ文字列が空の場合 ch='\\' となる) */
for( ch = '\\' , pf = pd ; *pf != '\0' ; pf++ ){
ch = *pf;
if( _IS_SJIS_1(*pf) ) pf++; /* Shift_JIS の1文字目なら次の1文字をスキップ */
}
/* 文字列が空でなく、かつ、最後の文字が \ でなかったならば \ を追加。 */
if( ( ch != '\\' ) && ( strlen(ppp) < _MAX_PATH -1 ) ){
*pf++ = '\\'; *pf = '\0';
}
/* printf("%d:{%s}\n",strlen(ppp),ppp); /* for DEBUG */
/* ディレクトリ名を返値として書き込む。 */
strncpy(dir,pd,_MAX_DIR -1);
dir[_MAX_DIR -1] = '\0';
}
*pd = '\0'; /* ディレクトリ名の先頭位置を文字列終端にする。 */
if( drv != NULL ){ /* ドライブレターを返値として書き込む。 */
strncpy(drv,ppp,_MAX_DRIVE -1);
drv[_MAX_DRIVE -1] = '\0';
}
}
return;
}
/* file end */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -