2009.10.31 Saturday | 09:05

  MLOOP.H 利用サンプル ふるいむかし

要するに好きなループプロックを抜け出せるようにしていたんだっけ
たしか、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 );

}