Changeset 696 in dev for trunk/ab5.0
- Timestamp:
- Jul 19, 2008, 5:52:36 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ab5.0/abdev/ab_common/src/Lexical/Source.cpp
r641 r696 29 29 filepaths.clear(); 30 30 } 31 bool IsIncluded( const char *includeFilePath ){31 bool IsIncluded( const std::string &includeFilePath ){ 32 32 // '/' → '\\' 33 33 char tempPath[MAX_PATH]; 34 lstrcpy( tempPath, includeFilePath );34 lstrcpy( tempPath, includeFilePath.c_str() ); 35 35 for( int i=0; tempPath[i]; i++ ){ 36 36 if( tempPath[i] == '/' ){ … … 48 48 return false; 49 49 } 50 void Add( const char *includeFilePath ){50 void Add( const std::string &includeFilePath ){ 51 51 // '/' → '\\' 52 52 char tempPath[MAX_PATH]; 53 lstrcpy( tempPath, includeFilePath );53 lstrcpy( tempPath, includeFilePath.c_str() ); 54 54 for( int i=0; tempPath[i]; i++ ){ 55 55 if( tempPath[i] == '/' ){ … … 554 554 if((buffer[i-1]=='\n'||i==0)&&buffer[i]=='#'){ 555 555 bool isRequire = false; 556 557 int includeDirectiveLength; 558 559 char findStr[1024]; 556 560 if(memcmp( buffer + i + 1, "include", 7 ) == 0 557 || memcmp( buffer + i + 1, "require", 7 ) == 0){ 558 559 //#requireの場合 560 if( buffer[i + 1] == 'r' ) isRequire = true; 561 562 i2=i+8; 563 while(buffer[i2]==' '||buffer[i2]=='\t') i2++; 564 565 if(buffer[i2]=='\"') sw1=0; 566 else if(buffer[i2]=='<') sw1=1; 567 i2++; 568 569 for(i3=0;;i2++,i3++){ 570 if((buffer[i2]=='\"'&&sw1==0)||(buffer[i2]=='>'&&sw1==1)||buffer[i2]=='\n'||buffer[i2]=='\0'){ 571 temporary[i3]=0; 572 break; 573 } 574 temporary[i3]=buffer[i2]; 561 || memcmp( buffer + i + 1, "require", 7 ) == 0) 562 { 563 //#requireの場合 564 if( buffer[i + 1] == 'r' ) isRequire = true; 565 566 i2=i+8; 567 while(buffer[i2]==' '||buffer[i2]=='\t') i2++; 568 569 if(buffer[i2]=='\"') sw1=0; 570 else if(buffer[i2]=='<') sw1=1; 571 i2++; 572 573 for(i3=0;;i2++,i3++){ 574 if((buffer[i2]=='\"'&&sw1==0)||(buffer[i2]=='>'&&sw1==1)||buffer[i2]=='\n'||buffer[i2]=='\0'){ 575 temporary[i3]=0; 576 break; 575 577 } 576 while(buffer[i2]!='\n'&&buffer[i2]!='\0') i2++; 577 578 if(sw1){ 579 sprintf(temp2,"%s\\%s", includeDirPath.c_str(), temporary ); 580 lstrcpy(temporary,temp2); 581 } 582 else{ 583 Jenga::Common::Directory dir( LayerDir[layer] ); 584 lstrcpy( temporary, dir.GetFullPath( temporary ).c_str() ); 585 } 578 temporary[i3]=buffer[i2]; 579 } 580 while(buffer[i2]!='\n'&&buffer[i2]!='\0') i2++; 581 582 includeDirectiveLength = i2 - i; 583 584 if(sw1){ 585 sprintf(temp2,"%s\\%s", includeDirPath.c_str(), temporary ); 586 lstrcpy(findStr,temp2); 587 } 588 else{ 589 Jenga::Common::Directory dir( LayerDir[layer] ); 590 lstrcpy( findStr, dir.GetFullPath( temporary ).c_str() ); 591 } 586 592 } 587 593 else if(memcmp(buffer+i+1,"prompt",6)==0){ 588 i 2=i+7;589 sprintf( temporary,"%s\\basic\\prompt.sbp", includeDirPath.c_str() );594 includeDirectiveLength = 7; 595 sprintf(findStr,"%s\\basic\\prompt.sbp", includeDirPath.c_str() ); 590 596 } 591 597 else if(memcmp(buffer+i+1,"N88BASIC",8)==0){ 592 i 2=i+9;593 sprintf( temporary,"%s\\basic\\prompt.sbp", includeDirPath.c_str() );598 includeDirectiveLength = 9; 599 sprintf(findStr,"%s\\basic\\prompt.sbp", includeDirPath.c_str() ); 594 600 } 595 601 else if(memcmp(buffer+i+1,"console",7)==0){ … … 598 604 TypeOfSubSystem=IMAGE_SUBSYSTEM_WINDOWS_CUI; 599 605 600 i 2=i+8;601 sprintf( temporary,"%s\\basic\\dos_console.sbp", includeDirPath.c_str() );606 includeDirectiveLength = 8; 607 sprintf(findStr,"%s\\basic\\dos_console.sbp", includeDirPath.c_str() ); 602 608 } 603 609 else continue; 604 610 605 if( !Jenga::Common::Path( temporary ).IsExistFile() ) 611 // インクルードファイルを列挙(ワイルドカード指定を想定) 612 Jenga::Common::Strings resultOfFullPath; 613 Jenga::Common::FileSystem::SearchFiles( resultOfFullPath, findStr ); 614 615 if( resultOfFullPath.empty() ) 606 616 { 607 this->cannotIncludePath = temporary;617 this->cannotIncludePath = findStr; 608 618 this->cannotIncludeSourcePos = i; 609 619 includedFilesRelation.AddLine( FileLayer[layer] ); … … 611 621 } 612 622 613 if( i == 0 && Jenga::Common::Path(temporary).GetFileName() == "basic")623 for( int j=static_cast<int>(resultOfFullPath.size()-1); j>=0; j-- ) 614 624 { 615 } 616 else 617 { 618 //ディレクティブが消えるため、一行減ってしまうのを防ぐ(basic.sbpを除く) 619 Text::SlideString(buffer+i2,1); 620 buffer[i2]='\n'; 621 for(i3=0;i3<=layer;i3++) LastFileByte[i3]++; 622 } 623 624 layer++; 625 FileLayer[layer] = includedFilesRelation.AddFile( temporary ); 626 627 //#requireの場合では、既に読み込まれているファイルは読み込まないようにする 628 bool isFake = false; 629 if( isRequire ){ 630 if( requireFiles.IsIncluded( temporary ) ){ 631 //既に読み込まれているとき 632 isFake = true; 633 } 634 } 635 636 BasicSource source; 637 638 if( isFake ){ 639 //既に読み込まれているときは空データ 640 source.SetBuffer( "" ); 641 } 642 else{ 643 //取り込まれたファイルを収集する 644 requireFiles.Add( temporary ); 645 646 //インクルードファイルを読み込む 647 if( !source.ReadFile_InIncludeDirective( temporary ) ) 625 const std::string &sourceFilePath = resultOfFullPath[j]; 626 627 const int headIndex = i; 628 629 if( headIndex == 0 && Jenga::Common::Path( sourceFilePath ).GetFileName() == "basic" ) 648 630 { 649 throw; 650 } 651 } 652 653 i3=lstrlen(buffer)+source.GetLength(); 654 Realloc( i3 ); 655 Text::SlideString(buffer+i2,source.GetLength()+(i-i2)); 656 memcpy(buffer+i,source.GetBuffer(),source.GetLength()); 657 658 //新しい参照ディレクトリをセット 659 char temp4[MAX_PATH]; 660 _splitpath(temporary,temp2,temp4,0,0); 661 lstrcat(temp2,temp4); 662 LayerDir[layer]=(char *)malloc(lstrlen(temp2)+1); 663 lstrcpy(LayerDir[layer],temp2); 664 665 //ファイル範囲をスライド 666 LastFileByte[layer]=i+source.GetLength()-1; 667 for(i3=0;i3<layer;i3++) LastFileByte[i3]+=source.GetLength()+(i-i2); 668 631 // basic.sbpインクルード時は何もしない 632 // ワイルドカードで複数ファイルを指定した場合、2つ目以上のファイルの場合もこちら 633 } 634 else 635 { 636 //ディレクティブが消えるため、一行減ってしまうのを防ぐ(basic.sbpを除く) 637 Text::SlideString( buffer + headIndex + includeDirectiveLength, 1 ); 638 buffer[headIndex+includeDirectiveLength]='\n'; 639 for(i3=0;i3<=layer;i3++) LastFileByte[i3]++; 640 } 641 642 layer++; 643 FileLayer[layer] = includedFilesRelation.AddFile( sourceFilePath ); 644 645 //#requireの場合では、既に読み込まれているファイルは読み込まないようにする 646 bool isFake = false; 647 if( isRequire ){ 648 if( requireFiles.IsIncluded( sourceFilePath ) ){ 649 //既に読み込まれているとき 650 isFake = true; 651 } 652 } 653 654 BasicSource source; 655 656 if( isFake ){ 657 //既に読み込まれているときは空データ 658 source.SetBuffer( "" ); 659 } 660 else{ 661 //取り込まれたファイルを収集する 662 requireFiles.Add( sourceFilePath ); 663 664 //インクルードファイルを読み込む 665 if( !source.ReadFile_InIncludeDirective( sourceFilePath ) ) 666 { 667 throw; 668 } 669 } 670 671 Realloc( lstrlen(buffer) + source.GetLength() ); 672 Text::SlideString( 673 buffer + headIndex + includeDirectiveLength, 674 source.GetLength() - includeDirectiveLength 675 ); 676 memcpy( 677 buffer + headIndex, 678 source.GetBuffer(), 679 source.GetLength() 680 ); 681 682 //新しい参照ディレクトリをセット 683 char temp4[MAX_PATH]; 684 _splitpath(sourceFilePath.c_str(),temp2,temp4,0,0); 685 lstrcat(temp2,temp4); 686 LayerDir[layer]=(char *)malloc(lstrlen(temp2)+1); 687 lstrcpy(LayerDir[layer],temp2); 688 689 //ファイル範囲をスライド 690 LastFileByte[layer] = headIndex + source.GetLength() - 1; 691 for(i3=0;i3<layer;i3++) 692 { 693 LastFileByte[i3] += source.GetLength() - includeDirectiveLength; 694 } 695 696 includeDirectiveLength = 0; 697 } 669 698 i--; 670 699 }
Note:
See TracChangeset
for help on using the changeset viewer.