Ignore:
Timestamp:
Jul 13, 2007, 4:22:02 AM (17 years ago)
Author:
dai_9181
Message:

DllProcsクラスを追加。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler_Common/Subroutine.cpp

    r206 r209  
    277277}
    278278
    279 
    280 void AddDeclareData(const NamespaceScopes &namespaceScopes, char *buffer,int nowLine){
    281     extern HANDLE hHeap;
    282     int i2;
    283 
    284     int i=0;
    285 
    286     //Sub/Function
    287     Procedure::Kind kind = Procedure::Sub;
    288     if(buffer[i]==ESC_SUB){
    289     }
    290     else if(buffer[i]==ESC_FUNCTION){
    291         kind = Procedure::Function;
    292     }
    293     else{
    294         SetError(1,NULL,nowLine);
    295         return;
    296     }
    297     i++;
    298 
    299     //プロシージャ名
    300     char procName[VN_SIZE];
    301     bool isCdecl = false;
    302     for(i2=0;;i++,i2++){
    303         if(buffer[i]==1&&buffer[i+1]==ESC_CDECL){
    304             isCdecl = true;
    305 
    306             i+=2;
    307             procName[i2]=0;
    308             break;
    309         }
    310         if(buffer[i]==','){
    311             procName[i2]=0;
    312             break;
    313         }
    314         if(buffer[i]=='\0'){
    315             SetError(1,NULL,nowLine);
    316             return;
    317         }
    318         procName[i2]=buffer[i];
    319     }
    320     i++;
    321 
    322     //ユーザー定義関数との重複チェック
    323     if(GetSubHash(procName)){
    324         SetError(15,procName,nowLine);
    325         return;
    326     }
    327 
    328 
    329     //ライブラリ
    330     char dllFileName[MAX_PATH];
    331     i = GetOneParameter( buffer, i, dllFileName );
    332     Type resultType;
    333     _int64 i64data;
    334     if( !StaticCalculation( true, dllFileName, 0, &i64data, resultType ) ){
    335         return;
    336     }
    337     if( resultType.GetBasicType() != typeOfPtrChar ){
    338         SetError(1,NULL,nowLine);
    339         return;
    340     }
    341     lstrcpy( dllFileName, (char *)i64data );
    342     CharUpper(dllFileName);
    343     if(!strstr(dllFileName,".")){
    344         lstrcat(dllFileName,".DLL");
    345         if(lstrlen(dllFileName)>=16){
    346             SetError(7,NULL,nowLine);
    347             return;
    348         }
    349     }
    350 
    351     //エイリアス
    352     char alias[VN_SIZE];
    353     i = GetOneParameter( buffer, i, alias );
    354     if( alias[0] ){
    355         if( !StaticCalculation( true, alias, 0, &i64data, resultType ) ){
    356             return;
    357         }
    358         if( resultType.GetBasicType() != typeOfPtrChar ){
    359             SetError(1,NULL,nowLine);
    360             return;
    361         }
    362         lstrcpy( alias, (char *)i64data );
    363     }
    364     else{
    365         //省略されたときは関数名
    366         lstrcpy( alias, procName );
    367     }
    368 
    369 
    370     // オブジェクトを生成
    371     DllProc *pDllProc = new DllProc( namespaceScopes, procName, kind, isCdecl, dllFileName, alias );
    372 
    373     // パラメータを解析
    374     // ※第1パラメータにに指定するデータの例:"( s As String ) As String"
    375     pDllProc->SetParamsAndReturnType( buffer + i, nowLine );
    376 
    377     // パラメータのエラーチェック
    378     BOOST_FOREACH( const Parameter *pParam, pDllProc->Params() ){
    379         if( pParam->IsObject() ){
    380             SetError(25,pParam->GetVarName(),nowLine);
    381         }
    382         if( !pParam->IsRef() ){
    383             if( pParam->IsStruct() ){
    384                 SetError(28,pParam->GetVarName(),nowLine);
    385             }
    386         }
    387     }
    388 
    389     //戻り値のエラーチェック
    390     if( pDllProc->IsFunction() ){
    391         // Function定義
    392 
    393         if( pDllProc->ReturnType().IsObject() ){
    394             // DLL関数ではオブジェクトを戻り値にできない
    395             SetError(40,pDllProc->GetName(),nowLine);
    396         }
    397     }
    398 
    399 
    400     /////////////////////////////////
    401     // 格納位置を計算してppDeclareHashにセット
    402     /////////////////////////////////
    403 
    404     //ハッシュ値を取得
    405     int key;
    406     key=hash_default(procName);
    407 
    408     extern DllProc **ppDeclareHash;
    409     if(ppDeclareHash[key]){
    410         DllProc *pTempProc = ppDeclareHash[key];
    411         while(1){
    412             if( pTempProc->IsEqualSymbol( pDllProc->GetNamespaceScopes(), pDllProc->GetName() ) ){
    413                 //重複エラー
    414                 SetError(15,procName,nowLine);
    415                 return;
    416             }
    417 
    418             if(pTempProc->pNextData==0){
    419                 pTempProc->pNextData=pDllProc;
    420                 break;
    421             }
    422             pTempProc=pTempProc->pNextData;
    423         }
    424         pTempProc=pTempProc->pNextData;
    425     }
    426     else{
    427         ppDeclareHash[key]=pDllProc;
    428     }
    429 }
    430 
    431 void UserProcs::CollectUserProcs( const BasicSource &source, UserProcs &userProcs )
     279void CollectProcedures( const BasicSource &source, UserProcs &userProcs, DllProcs &dllProcs )
    432280{
    433281    extern HANDLE hHeap;
     
    435283    char temporary[8192];
    436284
    437     //Declare(DLL関数)情報を初期化
    438     extern DllProc **ppDeclareHash;
    439     ppDeclareHash=(DllProc **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(DllProc *));
    440 
    441285    //サブルーチン(ユーザー定義)情報を初期化
    442286    userProcs.Clear();
     287
     288    //Declare(DLL関数)情報を初期化
     289    dllProcs.Clear();
    443290
    444291    // 名前空間管理
     
    522369                if(source[i]=='\0') break;
    523370            }
    524             AddDeclareData(namespaceScopes,temporary,i);
     371            dllProcs.Add(namespaceScopes,temporary,i);
    525372
    526373            continue;
     
    600447    delete pDllProc;
    601448}
    602 void DeleteDeclareInfo(void){
    603     //DLL情報を解放
    604     extern DllProc **ppDeclareHash;
    605     int i;
    606     for(i=0;i<MAX_HASH;i++){
    607         if(!ppDeclareHash[i]) continue;
    608 
    609         Delete_di(ppDeclareHash[i]);
    610     }
    611     HeapDefaultFree(ppDeclareHash);
    612 }
    613449
    614450bool IsNeedProcCompile(){
Note: See TracChangeset for help on using the changeset viewer.