Changeset 209 in dev for trunk/abdev/BasicCompiler_Common/src/Procedure.cpp
- Timestamp:
- Jul 13, 2007, 4:22:02 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler_Common/src/Procedure.cpp
r208 r209 759 759 } 760 760 761 void 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 761 883 bool ProcPointer::SetParamsAndReturnType( const char *sourceOfParams, int nowLine ){ 762 884 int i = 0;
Note:
See TracChangeset
for help on using the changeset viewer.