要するに好きなループプロックを抜け出せるようにしていたんだっけ
たしか、while と for を統合していたような記憶もある・・・
MLOOP.H
//**********************************************************
//
// 複数ワイルドカード作成関数
//
// wldline にセットされた複合ワイルドカードを、
// 単一のワイルドカードに分解し、chkwld でチェックする
//
//**********************************************************
extern
int
chkwldline( char *fname, char *wldline )
{
int rtn; // 戻り値
char wldbase[128]; // トークン取り出し用のベースワーク
int basesw; // strtok 用スイッチ
int basecnt; // ベーストークン用カウンター
char *baseptr[40]; // ベーストークンポインタ
char *wldptr[40]; // 複合ワイルドカード(ファイルメイ)用トークンポインタ
char *wldptr2[40]; // 複合ワイルドカード(カクチョウシ)用トークンポインタ
int wldcnt; // ファイル名用カウンター
int wldcnt2; // 拡張子用カウンター
char wlds[128]; // 複合ワイルドカード用ワーク
int wldsw; // strtok 用スイッチ
char *dptr; // "." の次の文字列へのポインタ
char *sts; // "." の有無
char chkstring[128]; // chkwld 用文字列エリア
char ids[128]; // "." 以降のセーブエリア
//*********************************************************
// 初期設定
//*********************************************************
rtn = -1;
basesw = 0;
strcpy( wldbase, wldline );
AnsiUpper( wldbase ); // 小文字を大文字に変換
//*********************************************************
// スペースを区切り文字として複合ワイルドカードの分解
// し、ベーストークンを作成する
//*********************************************************
basecnt = 0;
MLOOP
if ( basesw == 0 ) {
baseptr[basecnt] = jstrtok( wldbase, " " );
basesw = 1;
}
else {
baseptr[basecnt] = jstrtok( NULL, " " );
}
if ( baseptr[basecnt] == NULL ) {
BREAK(1)
}
basecnt++;
if ( basecnt > 18 ) {
baseptr[basecnt] = NULL;
BREAK(1)
}
END
//*********************************************************
// ベーストークンの繰り返し
//*********************************************************
basecnt = 0;
MLOOP
if ( baseptr[basecnt] == NULL ) { // 全く合致しなかった
BREAK(1)
}
// ベーストークンをワークへ
strcpy( wlds, baseptr[basecnt] );
sts = strchr( wlds, '.' ); // "." の有無をチェツク
if ( sts != NULL ) {
dptr = jstrtok( wlds, "." );
dptr = jstrtok( NULL, "." ); // dptr は拡張子の先頭を指す
}
//*********************************************************
// 複合ワイルドカードに "." がない時
//*********************************************************
if ( sts == NULL ) {
wldsw = 0;
wldcnt = 0;
LOOP // ファイル名の分解
if ( wldsw == 0 ) {
wldptr[wldcnt] = jstrtok( wlds, "/|" );
wldsw = 1;
}
else {
wldptr[wldcnt] = jstrtok( NULL, "/|" );
}
if ( wldptr[wldcnt] == NULL ) {
BREAK(1)
}
wldcnt++;
if ( wldcnt > 18 ) {
wldptr[wldcnt] = NULL;
BREAK(1)
}
ENDLOOP
wldcnt = 0;
LOOP // チェックループ
if ( wldptr[wldcnt] == NULL ) {
BREAK(1)
}
rtn = chkwld( fname, wldptr[wldcnt] );
if ( rtn == 1 ) { // 一つでも合致するとOK
BREAK(2)
}
wldcnt++;
ENDLOOP
}
//*********************************************************
// 複合ワイルドカードに "." がある時
//*********************************************************
else {
wldsw = 0;
wldcnt = 0;
LOOP // ファイル名の分解
if ( wldsw == 0 ) {
wldptr[wldcnt] = jstrtok( wlds, "/|" );
wldsw = 1;
}
else {
wldptr[wldcnt] = jstrtok( NULL, "/|" );
}
if ( wldptr[wldcnt] == NULL ) {
BREAK(1)
}
wldcnt++;
if ( wldcnt > 18 ) {
wldptr[wldcnt] = NULL;
BREAK(1)
}
ENDLOOP
wldcnt = 0;
LOOP // ファイル名のループ
if ( wldptr[wldcnt] == NULL ) {
BREAK(1)
}
wldsw = 0;
wldcnt2 = 0;
strcpy( ids, dptr );
LOOP // 拡張子の分解
if ( wldsw == 0 ) {
wldptr2[wldcnt2] = jstrtok( ids, "/|" );
wldsw = 1;
}
else {
wldptr2[wldcnt2] = jstrtok( NULL, "/|" );
}
if ( wldptr2[wldcnt2] == NULL ) {
BREAK(1)
}
wldcnt2++;
if ( wldcnt2 > 18 ) {
wldptr2[wldcnt2] = NULL;
BREAK(1)
}
ENDLOOP
wldcnt2 = 0;
LOOP // チェックループ
if ( wldptr2[wldcnt2] == NULL ) {
BREAK(1)
}
// ファイル名と拡張子より wldchk 用文字列作成
strcpy( chkstring, wldptr[wldcnt] );
strcat( chkstring, "." );
strcat( chkstring, wldptr2[wldcnt2] );
rtn = chkwld( fname, chkstring );
if ( rtn == 1 ) { // 一つでも合致するとOK
BREAK(3)
}
wldcnt2++;
ENDLOOP
wldcnt++;
ENDLOOP
}
basecnt++;
END
return( rtn );
}