Index: trunk/ab5.0/abdev/ab_common/src/Lexical/Source.cpp
===================================================================
--- trunk/ab5.0/abdev/ab_common/src/Lexical/Source.cpp	(revision 641)
+++ trunk/ab5.0/abdev/ab_common/src/Lexical/Source.cpp	(revision 696)
@@ -29,8 +29,8 @@
 		filepaths.clear();
 	}
-	bool IsIncluded( const char *includeFilePath ){
+	bool IsIncluded( const std::string &includeFilePath ){
 		// '/' → '\\'
 		char tempPath[MAX_PATH];
-		lstrcpy( tempPath, includeFilePath );
+		lstrcpy( tempPath, includeFilePath.c_str() );
 		for( int i=0; tempPath[i]; i++ ){
 			if( tempPath[i] == '/' ){
@@ -48,8 +48,8 @@
 		return false;
 	}
-	void Add( const char *includeFilePath ){
+	void Add( const std::string &includeFilePath ){
 		// '/' → '\\'
 		char tempPath[MAX_PATH];
-		lstrcpy( tempPath, includeFilePath );
+		lstrcpy( tempPath, includeFilePath.c_str() );
 		for( int i=0; tempPath[i]; i++ ){
 			if( tempPath[i] == '/' ){
@@ -554,42 +554,48 @@
 		if((buffer[i-1]=='\n'||i==0)&&buffer[i]=='#'){
 			bool isRequire = false;
+
+			int includeDirectiveLength;
+
+			char findStr[1024];
 			if(memcmp( buffer + i + 1, "include", 7 ) == 0
-				|| memcmp( buffer + i + 1, "require", 7 ) == 0){
-
-					//#requireの場合
-					if( buffer[i + 1] == 'r' ) isRequire = true;
-
-					i2=i+8;
-					while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
-
-					if(buffer[i2]=='\"') sw1=0;
-					else if(buffer[i2]=='<') sw1=1;
-					i2++;
-
-					for(i3=0;;i2++,i3++){
-						if((buffer[i2]=='\"'&&sw1==0)||(buffer[i2]=='>'&&sw1==1)||buffer[i2]=='\n'||buffer[i2]=='\0'){
-							temporary[i3]=0;
-							break;
-						}
-						temporary[i3]=buffer[i2];
+				|| memcmp( buffer + i + 1, "require", 7 ) == 0)
+			{
+				//#requireの場合
+				if( buffer[i + 1] == 'r' ) isRequire = true;
+
+				i2=i+8;
+				while(buffer[i2]==' '||buffer[i2]=='\t') i2++;
+
+				if(buffer[i2]=='\"') sw1=0;
+				else if(buffer[i2]=='<') sw1=1;
+				i2++;
+
+				for(i3=0;;i2++,i3++){
+					if((buffer[i2]=='\"'&&sw1==0)||(buffer[i2]=='>'&&sw1==1)||buffer[i2]=='\n'||buffer[i2]=='\0'){
+						temporary[i3]=0;
+						break;
 					}
-					while(buffer[i2]!='\n'&&buffer[i2]!='\0') i2++;
-
-					if(sw1){
-						sprintf(temp2,"%s\\%s", includeDirPath.c_str(), temporary );
-						lstrcpy(temporary,temp2);
-					}
-					else{
-						Jenga::Common::Directory dir( LayerDir[layer] );
-						lstrcpy( temporary, dir.GetFullPath( temporary ).c_str() );
-					}
+					temporary[i3]=buffer[i2];
+				}
+				while(buffer[i2]!='\n'&&buffer[i2]!='\0') i2++;
+
+				includeDirectiveLength = i2 - i;
+
+				if(sw1){
+					sprintf(temp2,"%s\\%s", includeDirPath.c_str(), temporary );
+					lstrcpy(findStr,temp2);
+				}
+				else{
+					Jenga::Common::Directory dir( LayerDir[layer] );
+					lstrcpy( findStr, dir.GetFullPath( temporary ).c_str() );
+				}
 			}
 			else if(memcmp(buffer+i+1,"prompt",6)==0){
-				i2=i+7;
-				sprintf(temporary,"%s\\basic\\prompt.sbp", includeDirPath.c_str() );
+				includeDirectiveLength = 7;
+				sprintf(findStr,"%s\\basic\\prompt.sbp", includeDirPath.c_str() );
 			}
 			else if(memcmp(buffer+i+1,"N88BASIC",8)==0){
-				i2=i+9;
-				sprintf(temporary,"%s\\basic\\prompt.sbp", includeDirPath.c_str() );
+				includeDirectiveLength = 9;
+				sprintf(findStr,"%s\\basic\\prompt.sbp", includeDirPath.c_str() );
 			}
 			else if(memcmp(buffer+i+1,"console",7)==0){
@@ -598,12 +604,16 @@
 				TypeOfSubSystem=IMAGE_SUBSYSTEM_WINDOWS_CUI;
 
-				i2=i+8;
-				sprintf(temporary,"%s\\basic\\dos_console.sbp", includeDirPath.c_str() );
+				includeDirectiveLength = 8;
+				sprintf(findStr,"%s\\basic\\dos_console.sbp", includeDirPath.c_str() );
 			}
 			else continue;
 
-			if( !Jenga::Common::Path( temporary ).IsExistFile() )
+			// インクルードファイルを列挙（ワイルドカード指定を想定）
+			Jenga::Common::Strings resultOfFullPath;
+			Jenga::Common::FileSystem::SearchFiles( resultOfFullPath, findStr );
+
+			if( resultOfFullPath.empty() )
 			{
-				this->cannotIncludePath = temporary;
+				this->cannotIncludePath = findStr;
 				this->cannotIncludeSourcePos = i;
 				includedFilesRelation.AddLine( FileLayer[layer] );
@@ -611,60 +621,79 @@
 			}
 
-			if( i == 0 && Jenga::Common::Path(temporary).GetFileName() == "basic" )
+			for( int j=static_cast<int>(resultOfFullPath.size()-1); j>=0; j-- )
 			{
-			}
-			else
-			{
-				//ディレクティブが消えるため、一行減ってしまうのを防ぐ（basic.sbpを除く）
-				Text::SlideString(buffer+i2,1);
-				buffer[i2]='\n';
-				for(i3=0;i3<=layer;i3++) LastFileByte[i3]++;
-			}
-
-			layer++;
-			FileLayer[layer] = includedFilesRelation.AddFile( temporary );
-
-			//#requireの場合では、既に読み込まれているファイルは読み込まないようにする
-			bool isFake = false;
-			if( isRequire ){
-				if( requireFiles.IsIncluded( temporary ) ){
-					//既に読み込まれているとき
-					isFake = true;
-				}
-			}
-
-			BasicSource source;
-
-			if( isFake ){
-				//既に読み込まれているときは空データ
-				source.SetBuffer( "" );
-			}
-			else{
-				//取り込まれたファイルを収集する
-				requireFiles.Add( temporary );
-
-				//インクルードファイルを読み込む
-				if( !source.ReadFile_InIncludeDirective( temporary ) )
+				const std::string &sourceFilePath = resultOfFullPath[j];
+
+				const int headIndex = i;
+
+				if( headIndex == 0 && Jenga::Common::Path( sourceFilePath ).GetFileName() == "basic" )
 				{
-					throw;
-				}
-			}
-
-			i3=lstrlen(buffer)+source.GetLength();
-			Realloc( i3 );
-			Text::SlideString(buffer+i2,source.GetLength()+(i-i2));
-			memcpy(buffer+i,source.GetBuffer(),source.GetLength());
-
-			//新しい参照ディレクトリをセット
-			char temp4[MAX_PATH];
-			_splitpath(temporary,temp2,temp4,0,0);
-			lstrcat(temp2,temp4);
-			LayerDir[layer]=(char *)malloc(lstrlen(temp2)+1);
-			lstrcpy(LayerDir[layer],temp2);
-
-			//ファイル範囲をスライド
-			LastFileByte[layer]=i+source.GetLength()-1;
-			for(i3=0;i3<layer;i3++) LastFileByte[i3]+=source.GetLength()+(i-i2);
-
+					// basic.sbpインクルード時は何もしない
+					// ワイルドカードで複数ファイルを指定した場合、２つ目以上のファイルの場合もこちら
+				}
+				else
+				{
+					//ディレクティブが消えるため、一行減ってしまうのを防ぐ（basic.sbpを除く）
+					Text::SlideString( buffer + headIndex + includeDirectiveLength, 1 );
+					buffer[headIndex+includeDirectiveLength]='\n';
+					for(i3=0;i3<=layer;i3++) LastFileByte[i3]++;
+				}
+
+				layer++;
+				FileLayer[layer] = includedFilesRelation.AddFile( sourceFilePath );
+
+				//#requireの場合では、既に読み込まれているファイルは読み込まないようにする
+				bool isFake = false;
+				if( isRequire ){
+					if( requireFiles.IsIncluded( sourceFilePath ) ){
+						//既に読み込まれているとき
+						isFake = true;
+					}
+				}
+
+				BasicSource source;
+
+				if( isFake ){
+					//既に読み込まれているときは空データ
+					source.SetBuffer( "" );
+				}
+				else{
+					//取り込まれたファイルを収集する
+					requireFiles.Add( sourceFilePath );
+
+					//インクルードファイルを読み込む
+					if( !source.ReadFile_InIncludeDirective( sourceFilePath ) )
+					{
+						throw;
+					}
+				}
+
+				Realloc( lstrlen(buffer) + source.GetLength() );
+				Text::SlideString(
+					buffer + headIndex + includeDirectiveLength,
+					source.GetLength() - includeDirectiveLength
+				);
+				memcpy(
+					buffer + headIndex,
+					source.GetBuffer(),
+					source.GetLength()
+				);
+
+				//新しい参照ディレクトリをセット
+				char temp4[MAX_PATH];
+				_splitpath(sourceFilePath.c_str(),temp2,temp4,0,0);
+				lstrcat(temp2,temp4);
+				LayerDir[layer]=(char *)malloc(lstrlen(temp2)+1);
+				lstrcpy(LayerDir[layer],temp2);
+
+				//ファイル範囲をスライド
+				LastFileByte[layer] = headIndex + source.GetLength() - 1;
+				for(i3=0;i3<layer;i3++)
+				{
+					LastFileByte[i3] += source.GetLength() - includeDirectiveLength;
+				}
+
+				includeDirectiveLength = 0;
+			}
 			i--;
 		}
