Changeset 700 in dev


Ignore:
Timestamp:
Jul 21, 2008, 1:04:12 AM (13 years ago)
Author:
イグトランス (egtra)
Message:

CRequireFilesの管理をhash_setベースへ。保存時にFileIndexの記録を行っていなかった問題を修正。rev.669でコミットし忘れのcompiler_x86/NumOpe.cppを追加。

Location:
trunk/ab5.0/abdev
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/abdev/ab_common/include/Lexical/Source.h

    r637 r700  
    8484    {
    8585        buffer = (char *)realloc( buffer, length + str.size() + 1 );
    86         lstrcpy( buffer + length, str.c_str() );
     86        strcpy( buffer + length, str.c_str() );
    8787        length += (int)str.size();
    8888    }
     
    9090    {
    9191        buffer = (char *)realloc( buffer, length + str.size() + 1 );
    92         lstrcpy( buffer + length, &str[0] );
     92        strcpy( buffer + length, &str[0] );
    9393        length += (int)str.size();
    9494    }
     
    9797
    9898    static void Text::SlideString(char *buffer, int slide){
    99         char *temp;
    100         temp=(char *)malloc(lstrlen(buffer)+1);
    101         lstrcpy(temp,buffer);
    102         lstrcpy(buffer+slide,temp);
    103         free(temp);
     99        memmove(buffer+slide, buffer, strlen(buffer)+1);
    104100    }
    105101};
     
    213209    void _ResetLength()
    214210    {
    215         length = lstrlen( buffer );
     211        length = strlen( buffer );
    216212    }
    217213
     
    231227    void operator = ( const BasicSource &source ){
    232228        Realloc( source.length );
    233         lstrcpy( buffer, source.buffer );
     229        strcpy( buffer, source.buffer );
    234230    }
    235231
  • trunk/ab5.0/abdev/ab_common/src/Lexical/Const.cpp

    r640 r700  
    123123
    124124    //データ
    125     lstrcpy(temporary,parameterStr+i+1);
     125    strcpy(temporary,parameterStr+i+1);
    126126
    127127    this->Put( new ConstMacro( symbol, parameters, temporary ) );
  • trunk/ab5.0/abdev/ab_common/src/Lexical/DataTable.cpp

    r640 r700  
    3131int DataTable::AddString( const char *str )
    3232{
    33     return AddBinary( str, lstrlen( str ) + sizeof(char) );
     33    return AddBinary( str, strlen( str ) + sizeof(char) );
    3434}
    3535int DataTable::AddString( const std::string &str )
  • trunk/ab5.0/abdev/ab_common/src/Lexical/Namespace.cpp

    r669 r700  
    6767    }
    6868
    69     lstrcpy( namespaceStr, namespaceScopes.ToString().c_str() );
     69    strcpy( namespaceStr, namespaceScopes.ToString().c_str() );
    7070
    7171    bool hasNamespace = false;
     
    7979    }
    8080
    81     lstrcpy( simpleName, fullName + lstrlen( namespaceStr ) + dotLength );
     81    strcpy( simpleName, fullName + strlen( namespaceStr ) + dotLength );
    8282}
    8383
  • trunk/ab5.0/abdev/ab_common/src/Lexical/Source.cpp

    r696 r700  
    11#include "stdafx.h"
     2#include <hash_set>
    23
    34const std::string BasicSource::generateDirectiveName = "#generate";
     
    1011    void Init( bool isDebug, bool isDll, bool isUnicode, int majorVer );
    1112
    12     BOOL add(char *name);
    13     BOOL undef(char *name);
    14     BOOL check(char *name);
     13    BOOL add(char const *name);
     14    BOOL undef(char const *name);
     15    BOOL check(char const *name);
    1516    void preprocessor_ifdef(char *buffer,bool isNot);
    1617    void DirectiveIfdef(char *buffer);
     
    2223// #requireの管理
    2324//////////////////////////////////////
     25namespace
     26{
    2427class CRequireFiles{
    25     Jenga::Common::Strings filepaths;
     28    stdext::hash_set<std::string> filepaths;
    2629public:
    27 
    2830    void clear(){
    2931        filepaths.clear();
    3032    }
    31     bool IsIncluded( const std::string &includeFilePath ){
    32         // '/' → '\\'
     33    //既に存在するものを追加しようとするとfalseを返す(旧IsIncludedと逆なことに注意)
     34    bool TryAdd( const std::string &includeFilePath ){
    3335        char tempPath[MAX_PATH];
    34         lstrcpy( tempPath, includeFilePath.c_str() );
    35         for( int i=0; tempPath[i]; i++ ){
    36             if( tempPath[i] == '/' ){
     36        DWORD len = GetShortPathName(includeFilePath.c_str(), tempPath, MAX_PATH);
     37        if (len >= MAX_PATH){
     38            return false;
     39        }
     40        for( DWORD i = 0; i < len; ++i ){
     41            char c = toupper(tempPath[i]);
     42            if (c == '/'){
    3743                tempPath[i] = '\\';
    3844            }
    39         }
    40 
    41         BOOST_FOREACH( const std::string &filepath, filepaths )
    42         {
    43             if( lstrcmpi( filepath.c_str(), tempPath ) == 0 )
    44             {
    45                 return true;
    46             }
    47         }
    48         return false;
    49     }
    50     void Add( const std::string &includeFilePath ){
    51         // '/' → '\\'
    52         char tempPath[MAX_PATH];
    53         lstrcpy( tempPath, includeFilePath.c_str() );
    54         for( int i=0; tempPath[i]; i++ ){
    55             if( tempPath[i] == '/' ){
    56                 tempPath[i] = '\\';
    57             }
    58         }
    59 
    60         //既に読み込まれているとき
    61         if( IsIncluded( tempPath ) ) return;
    62 
    63         //追加
    64         filepaths.push_back( tempPath );
     45            else{
     46                tempPath[i] = c;
     47            }
     48        }
     49        return filepaths.insert( tempPath ).second;
    6550    }
    6651};
    6752CRequireFiles requireFiles;
    68 
     53} //namespace
    6954
    7055//////////////////////////////////////
     
    9984    add(temporary);
    10085}
    101 BOOL CDefine::add(char *name)
     86BOOL CDefine::add(char const *name)
    10287{
    10388    //重複チェック
     
    10994    return 1;
    11095}
    111 BOOL CDefine::undef(char *name){
     96BOOL CDefine::undef(char const *name){
    11297    std::vector<std::string>::iterator i = names.begin();
    11398    BOOST_FOREACH( const std::string &temp, names ){
     
    121106    return 0;
    122107}
    123 BOOL CDefine::check(char *name){
     108BOOL CDefine::check(char const *name){
    124109
    125110    //重複チェック
     
    132117}
    133118
    134 int Search_endif(char *buffer,int i, int *pLine = 0){
     119int Search_endif(char const *buffer,int i, int *pLine = 0){
    135120    for(;;i++){
    136121        if(buffer[i]=='\0') break;
     
    143128
    144129        if(buffer[i-1]=='\n'){
    145             if(memicmp(buffer+i,"#ifdef",6)==0||memicmp(buffer+i,"#ifndef",7)==0){
     130            if(_memicmp(buffer+i,"#ifdef",6)==0||_memicmp(buffer+i,"#ifndef",7)==0){
    146131                i=Search_endif(buffer,i+6, pLine);
    147132                if(buffer[i]=='\0') break;
    148133                continue;
    149134            }
    150             else if(memicmp(buffer+i,"#endif",6)==0){
     135            else if(_memicmp(buffer+i,"#endif",6)==0){
    151136                break;
    152137            }
     
    160145    char temporary[VN_SIZE];
    161146
    162     if(isNot) i=lstrlen("#ifndef");
    163     else i=lstrlen("#ifdef");
     147    if(isNot) i=strlen("#ifndef");
     148    else i=strlen("#ifdef");
    164149    while(buffer[i]==' '||buffer[i]=='\t') i++;
    165150
     
    445430void BasicSource::RemoveComments(){
    446431    int i,i2,i3,IsStr;
    447     char *temporary;
    448     temporary=(char *)GlobalAlloc(GMEM_FIXED,lstrlen(buffer)+1);
     432    char *temporary=static_cast<char *>(malloc(strlen(buffer)+1));
    449433    for(i=0,i2=0,i3=0,IsStr=0;;i++,i2++){
    450434        if(buffer[i]=='\"') IsStr^=1;
     
    487471        if(buffer[i]=='\0') break;
    488472    }
    489     lstrcpy(buffer,temporary);
    490     GlobalFree(temporary);
     473    strcpy(buffer,temporary);
     474    free(temporary);
    491475}
    492476
     
    538522    std::string mainSourceFileDir = Jenga::Common::Path::ExtractDirPath( mainSourceFilePath );
    539523    LayerDir[0]=(char *)malloc(mainSourceFileDir.size()+1);
    540     lstrcpy(LayerDir[0],mainSourceFileDir.c_str());
     524    strcpy(LayerDir[0],mainSourceFileDir.c_str());
    541525
    542526    for(i=0;;i++){
     
    584568                if(sw1){
    585569                    sprintf(temp2,"%s\\%s", includeDirPath.c_str(), temporary );
    586                     lstrcpy(findStr,temp2);
     570                    strcpy(findStr,temp2);
    587571                }
    588572                else{
    589573                    Jenga::Common::Directory dir( LayerDir[layer] );
    590                     lstrcpy( findStr, dir.GetFullPath( temporary ).c_str() );
     574                    strcpy( findStr, dir.GetFullPath( temporary ).c_str() );
    591575                }
    592576            }
     
    611595            // インクルードファイルを列挙(ワイルドカード指定を想定)
    612596            Jenga::Common::Strings resultOfFullPath;
    613             Jenga::Common::FileSystem::SearchFiles( resultOfFullPath, findStr );
     597//          Jenga::Common::FileSystem::SearchFiles( resultOfFullPath, findStr );
     598            resultOfFullPath.push_back(findStr);
    614599
    615600            if( resultOfFullPath.empty() )
     
    644629
    645630                //#requireの場合では、既に読み込まれているファイルは読み込まないようにする
     631/*
    646632                bool isFake = false;
    647633                if( isRequire ){
    648                     if( requireFiles.IsIncluded( sourceFilePath ) ){
     634                    if( requireFiles.TryAdd( sourceFilePath ) ){
    649635                        //既に読み込まれているとき
    650636                        isFake = true;
     
    668654                    }
    669655                }
    670 
    671                 Realloc( lstrlen(buffer) + source.GetLength() );
     656*/
     657                BasicSource source;
     658
     659                if( !requireFiles.TryAdd( sourceFilePath ) && isRequire ){
     660                    //既に読み込まれているときは空データ
     661                    source.SetBuffer( "" );
     662                }
     663                else{
     664                    //インクルードファイルを読み込む
     665                    if( !source.ReadFile_InIncludeDirective( sourceFilePath ) )
     666                    {
     667                        throw;
     668                    }
     669                }
     670
     671                Realloc( strlen(buffer) + source.GetLength() );
    672672                Text::SlideString(
    673673                    buffer + headIndex + includeDirectiveLength,
     
    683683                char temp4[MAX_PATH];
    684684                _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);
     685                strcat(temp2,temp4);
     686                LayerDir[layer]=(char *)malloc(strlen(temp2)+1);
     687                strcpy(LayerDir[layer],temp2);
    688688
    689689                //ファイル範囲をスライド
     
    702702    free(LayerDir[0]);
    703703
    704     length = lstrlen(buffer);
     704    length = strlen(buffer);
    705705}
    706706
     
    825825    }
    826826
    827     length = lstrlen(buffer);
     827    length = strlen(buffer);
    828828}
    829829
     
    840840
    841841    //最終行には文字を含ませないようにする
    842     if( lstrlen(buffer)>0 && buffer[lstrlen(buffer)-1] != '\n' )
     842    if( strlen(buffer)>0 && buffer[strlen(buffer)-1] != '\n' )
    843843    {
    844844        Realloc( length + 1 );
    845         lstrcat( buffer, "\n" );
     845        strcat( buffer, "\n" );
    846846    }
    847847
     
    851851
    852852void BasicSource::SetBuffer( const char *buffer ){
    853     this->buffer = (char *)calloc( lstrlen(buffer) + 1, 1 );
    854     lstrcpy( this->buffer, buffer );
    855     length = lstrlen(buffer);
     853    this->buffer = (char *)calloc( strlen(buffer) + 1, 1 );
     854    strcpy( this->buffer, buffer );
     855    length = strlen(buffer);
    856856
    857857    // ダミー改行をセット
     
    874874    //const char *headCode = "#include <basic.sbp>\n";
    875875    const char *headCode = "";
    876     Realloc( length + lstrlen(headCode) );
    877     Text::SlideString( buffer, lstrlen(headCode) );
    878     memcpy( buffer, headCode, lstrlen(headCode) );
     876    Realloc( length + strlen(headCode) );
     877    Text::SlideString( buffer, strlen(headCode) );
     878    memcpy( buffer, headCode, strlen(headCode) );
    879879
    880880    // #defineと#requireを初期化
     
    891891    //最終行には文字を含ませないようにする
    892892    Realloc( length + 1 );
    893     lstrcat( buffer, "\n" );
     893    strcat( buffer, "\n" );
    894894
    895895    // #include / #require ディレクティブを処理
     
    912912
    913913void BasicSource::Addition( const char *buffer ){
    914     Realloc( length + lstrlen(buffer) );
    915     lstrcat( this->buffer, buffer );
     914    Realloc( length + strlen(buffer) );
     915    strcat( this->buffer, buffer );
    916916}
    917917
  • trunk/ab5.0/abdev/ab_common/stdafx.h

    r519 r700  
    11#pragma once
     2#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
    23
    34#include <map>
     
    2930#include "include/ab_common.h"
    3031
     32size_t strlenSSE2(const char *);
     33#define strlen strlenSSE2
     34#define lstrlenA strlenSSE2
  • trunk/ab5.0/abdev/abdev/Common.h

    r697 r700  
    949949void GetItemClassName(char *buffer,int Control);
    950950void SaveWindowProgram();
    951 void SaveWindowFile( char *path, const ActiveBasic::PM::WindowInfos &windowInfos );
     951void SaveWindowFile(char const *path, const ActiveBasic::PM::WindowInfos &windowInfos);
    952952_int8 OpenWindowFile(char *path);
    953953void GetDefaultWindowFont(LOGFONT *LogFont);
  • trunk/ab5.0/abdev/abdev/FileOperation.cpp

    r697 r700  
    1616            return;
    1717        }
     18    }
     19    else{
     20        FindClose(hFind);
    1821    }
    1922}
     
    334337    return NewTextEditWindow(OpenFileName,DocumentType,TabColor);
    335338}
     339
     340BOOL GetFileInformationByHandleWrap(HANDLE hFile, BY_HANDLE_FILE_INFORMATION& fi){
     341    typedef BOOL WINAPI GFIBH(HANDLE, LPBY_HANDLE_FILE_INFORMATION);
     342    GFIBH *const pgfibh = reinterpret_cast<GFIBH*>(
     343        GetProcAddress(GetModuleHandle("kernel32"), "GetFileInformationByHandle"));
     344    if(pgfibh){
     345        return pgfibh(hFile, &fi);
     346    }
     347    else{
     348        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
     349        return FALSE;
     350    }
     351}
     352
     353//重複チェック用のデータを設定
     354void SetFileIdentity(FILEIDENTITY &fi, BY_HANDLE_FILE_INFORMATION const &bhfi){
     355    fi.VolumeSerialNumber = bhfi.dwVolumeSerialNumber;
     356    fi.FileIndexHigh = bhfi.nFileIndexHigh;
     357    fi.FileIndexLow = bhfi.nFileIndexLow;
     358}
     359
     360void SetFileIdentityFromFile(MDIINFO &mi, HANDLE hFile){
     361    BY_HANDLE_FILE_INFORMATION fi;
     362    if(GetFileInformationByHandleWrap(hFile, fi)){
     363        SetFileIdentity(mi.FileIdentity, fi);
     364    }
     365}
     366
    336367BOOL SaveDocument(HWND hChild,char *SaveFileName){  //ウィンドウからバッファを読み取り、ファイルに保存
     368    //SaveFileNameがNULLのときは上書き保存を試みる。
    337369    extern LPSTR IconFileFilter;
    338370    extern HWND hClient,hDocCombo;
     
    344376    WndNum=GetWndNum(hChild);
    345377
    346     char szOldTitle[MAX_PATH];
    347     lstrcpy(szOldTitle,MdiInfo[WndNum]->title.c_str());
     378    std::string oldTitle = MdiInfo[WndNum]->title;
    348379
    349380    if(MdiInfo[WndNum]->DocType==WNDTYPE_RAD||MdiInfo[WndNum]->DocType==WNDTYPE_MENU){
     
    353384
    354385        if(projectInfo.ModifyOfMaterial){
    355             sprintf(temporary,"%s%s.wnd",projectInfo.GetWorkDir().GetPath().c_str(),projectInfo.GetName().c_str());
    356             SaveWindowFile( temporary, projectInfo.windowInfos );
     386            std::string const& workDir = projectInfo.GetWorkDir().GetPath();
     387            std::string const& projName = projectInfo.GetName();
     388            std::string t;
     389            t.reserve( workDir.size() + projName.size() + 4 );
     390            t += workDir;
     391            t += projName;
     392            t += ".wnd";
     393            SaveWindowFile( t.c_str(), projectInfo.windowInfos );
    357394
    358395            //.wbpファイルを生成
     
    370407                sprintf(str,STRING_FILE_OVERWRIDE,temporary);
    371408                if(MessageBox(hOwner,str,APPLICATION_NAME,MB_YESNO|MB_ICONINFORMATION)==IDNO){
    372                     CloseHandle(fh);
    373409                    return 0;
    374410                }
     
    377413
    378414            //ドキュメント セレクト コンボボックスから消去
    379             i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(long)MdiInfo[WndNum]->title.c_str());
     415            i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(LONG_PTR)MdiInfo[WndNum]->title.c_str());
    380416            SendMessage(hDocCombo,CB_DELETESTRING,i2,0);
    381417
     
    387423            lstrcat(str,str2);
    388424            MdiInfo[WndNum]->title = str;
    389             SendMessage(hDocCombo,CB_ADDSTRING,0,(long)MdiInfo[WndNum]->title.c_str());
    390             i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(long)MdiInfo[WndNum]->title.c_str());
     425            SendMessage(hDocCombo,CB_ADDSTRING,0,(LONG_PTR)MdiInfo[WndNum]->title.c_str());
     426            i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(LONG_PTR)MdiInfo[WndNum]->title.c_str());
    391427            SendMessage(hDocCombo,CB_SETCURSEL,i2,0);
    392428
     
    448484            return 0;
    449485        }
    450         WriteFile(fh,pBuf,lstrlen(pBuf),&dummy,NULL);
     486        WriteFile(fh,pBuf,strlen(pBuf),&dummy,NULL);
     487        SetFileIdentityFromFile(*MdiInfo[WndNum], fh);
    451488        CloseHandle(fh);
    452489
     
    473510            CloseHandle(fh);
    474511            MdiInfo[WndNum]->path = temporary;
    475             i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(long)MdiInfo[WndNum]->title.c_str());
     512            i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(LONG_PTR)MdiInfo[WndNum]->title.c_str());
    476513            SendMessage(hDocCombo,CB_DELETESTRING,i2,0);
    477514            _splitpath(temporary,NULL,NULL,str,str2);
    478515            lstrcat(str,str2);
    479516            MdiInfo[WndNum]->title = str;
    480             SendMessage(hDocCombo,CB_ADDSTRING,0,(long)MdiInfo[WndNum]->title.c_str());
    481             i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(long)MdiInfo[WndNum]->title.c_str());
     517            SendMessage(hDocCombo,CB_ADDSTRING,0,(LONG_PTR)MdiInfo[WndNum]->title.c_str());
     518            i2=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(LONG_PTR)MdiInfo[WndNum]->title.c_str());
    482519            SendMessage(hDocCombo,CB_SETCURSEL,i2,0);
    483520            SetWindowText(hChild,MdiInfo[WndNum]->title.c_str());
     
    501538    if(pobj_nv->bSaveTabToHead){
    502539        COLORREF color;
    503         color=pobj_MainTab->GetItemColor(szOldTitle);
    504         pobj_MainTab->DeleteItem( szOldTitle, false );
     540        color=pobj_MainTab->GetItemColor(oldTitle.c_str());
     541        pobj_MainTab->DeleteItem( oldTitle.c_str(), false );
    505542        pobj_MainTab->InsertItem( MdiInfo[WndNum]->title.c_str(), false, color );
    506543    }
    507544    else{
    508         pobj_MainTab->RenameItem( szOldTitle, MdiInfo[WndNum]->title.c_str() );
     545        pobj_MainTab->RenameItem( oldTitle.c_str(), MdiInfo[WndNum]->title.c_str() );
    509546    }
    510547
  • trunk/ab5.0/abdev/abdev/IconEditor.cpp

    r629 r700  
    446446    ResetState_DocMenu();
    447447}
     448void SetFileIdentityFromFile(MDIINFO &mi, HANDLE hFile);
     449
    448450void SaveIconFile(char *filepath,HWND hwnd){
    449451    int i,i2,WndNum;
     
    526528    }
    527529    WriteFile(hFile,buffer,i2,&dummy,NULL);
     530    SetFileIdentityFromFile(*MdiInfo[WndNum], hFile);
    528531    CloseHandle(hFile);
    529532}
  • trunk/ab5.0/abdev/abdev/TabCtrl.cpp

    r629 r700  
    234234}
    235235
    236 COLORREF CMainTab::GetItemColor( char *ItemText ){
     236COLORREF CMainTab::GetItemColor( char const *ItemText ){
    237237    //インデックスを取得
    238238    int index = SearchItemIndex( ItemText );
    239     if( index == -1 ) return -1;
     239    if( index == -1 ) return static_cast<COLORREF>(-1);
    240240
    241241    TC_ITEM tcItem;
  • trunk/ab5.0/abdev/abdev/TabCtrl.h

    r626 r700  
    3737    void NofityUnModifyDocument( const char *ItemText );
    3838
    39     COLORREF GetItemColor( char *ItemText );
     39    COLORREF GetItemColor( char const *ItemText );
    4040
    4141    void SelChangeEvent();
  • trunk/ab5.0/abdev/abdev/WindowControl.cpp

    r655 r700  
    16531653    return i2;
    16541654}
    1655 void SaveWindowFile( char *path, const ActiveBasic::PM::WindowInfos &windowInfos )
     1655void SaveWindowFile( char const *path, const ActiveBasic::PM::WindowInfos &windowInfos )
    16561656{
    16571657    extern HANDLE hHeap;
  • trunk/ab5.0/abdev/abdev/abdev.cpp

    r697 r700  
    739739{
    740740    DWORD shortFilepathLen = GetShortPathName(path, buf, bufSize);
     741    CharUpper(buf);
    741742    std::replace(buf, buf + shortFilepathLen, '/', '\\');
    742743}
     744
     745BOOL GetFileInformationByHandleWrap(HANDLE hFile, BY_HANDLE_FILE_INFORMATION& fi);
     746void SetFileIdentity(FILEIDENTITY &mi, BY_HANDLE_FILE_INFORMATION const &bhfi);
    743747
    744748HWND NewTextEditWindow(const char *filepath,_int8 DocumentType,COLORREF TabColor)
     
    761765        DWORD length;
    762766
    763         typedef BOOL WINAPI GFIBH(HANDLE, LPBY_HANDLE_FILE_INFORMATION);
    764767        BY_HANDLE_FILE_INFORMATION fi;
    765         GFIBH *const pgfibh = reinterpret_cast<GFIBH*>(
    766             GetProcAddress(GetModuleHandle("kernel32"), "GetFileInformationByHandle"));
    767         if(pgfibh && pgfibh(hFile, &fi)){
    768             fileIdentity.VolumeSerialNumber = fi.dwVolumeSerialNumber;
    769             fileIdentity.FileIndexHigh = fi.nFileIndexHigh;
    770             fileIdentity.FileIndexLow = fi.nFileIndexLow;
     768        if(GetFileInformationByHandleWrap(hFile, fi)){
     769            SetFileIdentity(fileIdentity, fi);
    771770            length=fi.nFileSizeLow;
    772771        }
     
    807806        //////////////////////////////////////////////////////
    808807
    809         char *temp;
    810         temp=(char *)HeapAlloc(hHeap,0,length+1);
     808        char *temp=(char *)HeapAlloc(hHeap,0,length+1);
    811809        DWORD dw;
    812810        ReadFile(hFile,temp,length,&dw,NULL);
  • trunk/ab5.0/abdev/compiler_x86/NumOpe.cpp

    r676 r700  
    353353bool _TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, bool &isNeedHeapFreeStructure, bool *pIsClassName, bool isProcedureCallOnly, bool &isVariable, RELATIVE_VAR &relativeVar, bool isWriteAccess )
    354354{
     355    extern void GetWithName(std::string&);
     356
    355357    char parameter[VN_SIZE];
    356 
    357358    // Withを解決
    358     char termFull[VN_SIZE];
     359    std::string termFull;
    359360    if(term[0]=='.'){
    360361        GetWithName(termFull);
    361         lstrcat(termFull,term);
    362     }
    363     else lstrcpy(termFull,term);
    364 
    365     char termLeft[VN_SIZE];
    366     lstrcpy(termLeft,termFull);
     362        termFull.insert(termFull.end(),term,term+strlen(term));
     363    }
     364    else termFull.assign(term,term+strlen(term));
     365
     366    std::vector<char> termLeft(termFull.begin(), termFull.end());
     367    termLeft.push_back('\0');
    367368
    368369    // パース
    369370    char member[VN_SIZE];
    370371    ReferenceKind refType;
    371     if( SplitMemberName( termFull, termLeft, member, refType ) ){
     372    if( SplitMemberName( termFull.c_str(), &termLeft[0], member, refType ) ){
    372373        ///////////////////////////////////////////////////////////////////
    373374        // オブジェクトとメンバに分解できるとき
     
    380381        bool isClassName = false;
    381382        Type leftType;
    382         if( GetTermType( termLeft, Type(), leftType, isLiteral, &isClassName ) ){
     383        if( GetTermType( &termLeft[0], Type(), leftType, isLiteral, &isClassName ) ){
    383384            if( isClassName == false && compiler.GetObjectModule().meta.GetBlittableTypes().IsExist( leftType ) ){
    384385                // 左側のオブジェクト部分がBlittable型のとき
    385 
     386/*
    386387                char temporary[VN_SIZE];
    387388                lstrcpy( temporary, termLeft );
     
    389390                    compiler.GetObjectModule().meta.GetBlittableTypes().Find( leftType ).GetCreateStaticMethodFullName().c_str(),
    390391                    temporary );
    391             }
    392         }
    393 
    394         if( !TermOpe( termLeft, baseType, leftType, isLiteral, isNeedHeapFreeStructure, &isClassName ) ){
     392*/
     393                std::vector<char> temporary;
     394                const std::string& staticMethodFullName = compiler.GetObjectModule().meta.GetBlittableTypes().Find( leftType ).GetCreateStaticMethodFullName();
     395                temporary.reserve(VN_SIZE);
     396                temporary.assign(staticMethodFullName.begin(), staticMethodFullName.end());
     397                temporary.push_back('(');
     398                temporary.insert(temporary.end(), termLeft.begin(), termLeft.end());
     399                temporary.push_back(')');
     400                temporary.swap(termLeft);
     401            }
     402        }
     403
     404        if( !TermOpe( &termLeft[0], baseType, leftType, isLiteral, isNeedHeapFreeStructure, &isClassName ) ){
    395405            goto globalArea;
    396406        }
     
    410420        }
    411421
    412         return TermMemberOpe( leftType, isNeedHeapFreeStructure, baseType, resultType, termFull, termLeft, member, isVariable, relativeVar );
     422        return TermMemberOpe( leftType, isNeedHeapFreeStructure, baseType, resultType, termFull.c_str(), &termLeft[0], member, isVariable, relativeVar );
    413423    }
    414424globalArea:
     
    420430
    421431    if( pIsClassName ){
    422         if( compiler.GetObjectModule().meta.FindClassSupportedTypeDef( LexicalAnalyzer::FullNameToSymbol( termFull ) ) ){
     432        if( compiler.GetObjectModule().meta.FindClassSupportedTypeDef( LexicalAnalyzer::FullNameToSymbol( termFull.c_str() ) ) ){
    423433            *pIsClassName = true;
    424434            return true;
     
    434444
    435445
    436     if(lstrcmpi(termFull,"This")==0 && isProcedureCallOnly == false ){
     446    if(lstrcmpi(termFull.c_str(),"This")==0 && isProcedureCallOnly == false ){
    437447        if( !compiler.IsCompilingClass() )
    438448        {
     
    458468    char temporary[8192];
    459469
    460     int i2=GetCallProcName(termFull,procName);
     470    int i2=GetCallProcName(termFull.c_str(),procName);
    461471    if(termFull[i2]=='('){
    462         int i4=GetStringInPare_RemovePare(parameter,termFull+i2+1);
     472        int i4=GetStringInPare_RemovePare(parameter,termFull.c_str()+i2+1);
    463473
    464474        void *pInfo;
     
    557567
    558568    char VarName[VN_SIZE],ArrayElements[VN_SIZE];
    559     GetArrayElement(termFull,VarName,ArrayElements);
     569    GetArrayElement(termFull.c_str(),VarName,ArrayElements);
    560570    if(ArrayElements[0]){
    561571        Type classType;
     
    579589        false,  //エラー表示なし
    580590        isWriteAccess,
    581         termFull,
     591        termFull.c_str(),
    582592        &relativeVar,resultType)){
    583593        //////////
     
    599609
    600610    //配列要素を排除
    601     GetArrayElement(termFull,VarName,ArrayElements);
     611    GetArrayElement(termFull.c_str(),VarName,ArrayElements);
    602612
    603613    if(GetSubHash(VarName,0)){
    604614
    605615        {
    606             CallPropertyMethod(termFull,NULL,resultType);
     616            CallPropertyMethod(termFull.c_str(),NULL,resultType);
    607617
    608618            //大きな型への暗黙の変換
     
    636646    if( isProcedureCallOnly )
    637647    {
    638         compiler.errorMessenger.Output(3, termFull, cp );
     648        compiler.errorMessenger.Output(3, termFull.c_str(), cp );
    639649    }
    640650
Note: See TracChangeset for help on using the changeset viewer.