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/src/Procedure.cpp

    r208 r209  
    759759}
    760760
     761void DllProcs::Add(const NamespaceScopes &namespaceScopes, char *buffer,int nowLine){
     762    int i2;
     763
     764    int i=0;
     765
     766    //Sub/Function
     767    Procedure::Kind kind = Procedure::Sub;
     768    if(buffer[i]==ESC_SUB){
     769    }
     770    else if(buffer[i]==ESC_FUNCTION){
     771        kind = Procedure::Function;
     772    }
     773    else{
     774        SetError(1,NULL,nowLine);
     775        return;
     776    }
     777    i++;
     778
     779    //プロシージャ名
     780    char procName[VN_SIZE];
     781    bool isCdecl = false;
     782    for(i2=0;;i++,i2++){
     783        if(buffer[i]==1&&buffer[i+1]==ESC_CDECL){
     784            isCdecl = true;
     785
     786            i+=2;
     787            procName[i2]=0;
     788            break;
     789        }
     790        if(buffer[i]==','){
     791            procName[i2]=0;
     792            break;
     793        }
     794        if(buffer[i]=='\0'){
     795            SetError(1,NULL,nowLine);
     796            return;
     797        }
     798        procName[i2]=buffer[i];
     799    }
     800    i++;
     801
     802    //ユーザー定義関数との重複チェック
     803    if(GetSubHash(procName)){
     804        SetError(15,procName,nowLine);
     805        return;
     806    }
     807
     808
     809    //ライブラリ
     810    char dllFileName[MAX_PATH];
     811    i = GetOneParameter( buffer, i, dllFileName );
     812    Type resultType;
     813    _int64 i64data;
     814    if( !StaticCalculation( true, dllFileName, 0, &i64data, resultType ) ){
     815        return;
     816    }
     817    if( resultType.GetBasicType() != typeOfPtrChar ){
     818        SetError(1,NULL,nowLine);
     819        return;
     820    }
     821    lstrcpy( dllFileName, (char *)i64data );
     822    CharUpper(dllFileName);
     823    if(!strstr(dllFileName,".")){
     824        lstrcat(dllFileName,".DLL");
     825        if(lstrlen(dllFileName)>=16){
     826            SetError(7,NULL,nowLine);
     827            return;
     828        }
     829    }
     830
     831    //エイリアス
     832    char alias[VN_SIZE];
     833    i = GetOneParameter( buffer, i, alias );
     834    if( alias[0] ){
     835        if( !StaticCalculation( true, alias, 0, &i64data, resultType ) ){
     836            return;
     837        }
     838        if( resultType.GetBasicType() != typeOfPtrChar ){
     839            SetError(1,NULL,nowLine);
     840            return;
     841        }
     842        lstrcpy( alias, (char *)i64data );
     843    }
     844    else{
     845        //省略されたときは関数名
     846        lstrcpy( alias, procName );
     847    }
     848
     849
     850    // オブジェクトを生成
     851    DllProc *pDllProc = new DllProc( namespaceScopes, procName, kind, isCdecl, dllFileName, alias );
     852
     853    // パラメータを解析
     854    // ※第1パラメータにに指定するデータの例:"( s As String ) As String"
     855    pDllProc->SetParamsAndReturnType( buffer + i, nowLine );
     856
     857    // パラメータのエラーチェック
     858    BOOST_FOREACH( const Parameter *pParam, pDllProc->Params() ){
     859        if( pParam->IsObject() ){
     860            SetError(25,pParam->GetVarName(),nowLine);
     861        }
     862        if( !pParam->IsRef() ){
     863            if( pParam->IsStruct() ){
     864                SetError(28,pParam->GetVarName(),nowLine);
     865            }
     866        }
     867    }
     868
     869    //戻り値のエラーチェック
     870    if( pDllProc->IsFunction() ){
     871        // Function定義
     872
     873        if( pDllProc->ReturnType().IsObject() ){
     874            // DLL関数ではオブジェクトを戻り値にできない
     875            SetError(40,pDllProc->GetName(),nowLine);
     876        }
     877    }
     878
     879    // ハッシュマップに追加
     880    this->Put( pDllProc );
     881}
     882
    761883bool ProcPointer::SetParamsAndReturnType( const char *sourceOfParams, int nowLine ){
    762884    int i = 0;
Note: See TracChangeset for help on using the changeset viewer.