Changeset 75 in dev for BasicCompiler_Common/Subroutine.cpp
- Timestamp:
- Mar 20, 2007, 4:36:16 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler_Common/Subroutine.cpp
r73 r75 6 6 #include "../BasicCompiler32/opcode.h" 7 7 #endif 8 9 //コンパイル中の関数情報10 SubInfo *pCompilingSubInfo;11 8 12 9 int GetCallProcName(char *buffer,char *name){ … … 56 53 57 54 //関数ポインタ 58 int type; 59 LONG_PTR lpIndex; 60 type=GetVarType(name,&lpIndex,0); 61 if(type==DEF_PTR_PROC) return PROC_PTR; 55 Type type; 56 if( !GetVarType( name, type, false ) ){ 57 return 0; 58 } 59 if( type.IsProcPtr() ){ 60 return PROC_PTR; 61 } 62 62 63 63 return 0; … … 105 105 } 106 106 107 108 int CallProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex){ 109 int ret_type; 110 111 if(idProc==PROC_DEFAULT){ 107 bool CallProc( int kind, const void *pProc, const char *fullCallName, const char *lpszParms, Type &resultType, bool isCallOn ){ 108 109 //GetSubHash内でエラー提示が行われた場合 110 if(pProc==(Procedure *)-1){ 111 return false; 112 } 113 114 if(kind==PROC_DEFAULT){ 112 115 ///////////////////// 113 116 // ユーザー定義関数 114 117 ///////////////////// 115 118 116 SubInfo *pSub; 117 pSub=(SubInfo *)pInfo; 118 119 //GetSubHash内でエラー提示が行われた場合 120 if(pSub==(SubInfo *)-1) return -1; 121 119 UserProc *pUserProc = (UserProc *)pProc; 122 120 123 121 //オブジェクト名を取得 124 122 char ObjectName[VN_SIZE]; 125 123 int RefType; 126 SplitObjectName( name,ObjectName,&RefType);124 SplitObjectName(fullCallName,ObjectName,&RefType); 127 125 128 126 … … 131 129 //////////////////////// 132 130 133 std::vector< SubInfo*> subs;134 GetOverloadSubHash( name,subs);131 std::vector<UserProc *> subs; 132 GetOverloadSubHash(fullCallName,subs); 135 133 if(subs.size()){ 136 134 //オーバーロードを解決 137 pSub=OverloadSolutionWithStrParam(name,subs,Parameter,ObjectName,NULL); 138 139 if(!pSub) return 0; 140 } 141 142 143 Opcode_CallProc(Parameter,pSub,0,ObjectName,RefType); 144 if( plpRetIndex ){ 145 *plpRetIndex = pSub->u.ReturnIndex; 146 } 147 return pSub->ReturnType; 148 } 149 else if(idProc==PROC_DLL){ 135 pUserProc=OverloadSolutionWithStrParam(fullCallName,subs,lpszParms,ObjectName); 136 137 if(!pUserProc){ 138 return false; 139 } 140 } 141 142 resultType = pUserProc->ReturnType(); 143 144 if( isCallOn ){ 145 if( !Opcode_CallProc(lpszParms,pUserProc,0,ObjectName,RefType) ){ 146 return false; 147 } 148 } 149 } 150 else if(kind==PROC_DLL){ 150 151 ///////////////////////// 151 152 // DLL関数 152 153 ///////////////////////// 153 DECLAREINFO *pdi; 154 pdi=(DECLAREINFO *)pInfo; 155 156 ret_type=Opcode_CallDllProc(Parameter,pdi,plpRetIndex); 157 } 158 else if(idProc==PROC_BUILTIN){ 154 DllProc *pDllProc = (DllProc *)pProc; 155 156 resultType = pDllProc->ReturnType(); 157 158 if( isCallOn ){ 159 if( !Opcode_CallDllProc(lpszParms,pDllProc) ){ 160 return false; 161 } 162 } 163 } 164 else if(kind==PROC_BUILTIN){ 159 165 ///////////////////////// 160 166 // 組み込み関数 161 167 ///////////////////////// 162 int FuncId; 163 FuncId=(int)(_int64)pInfo; 164 165 TYPEINFO ReturnTypeInfo = { DEF_LONG, NULL }; 166 Opcode_CallFunc( Parameter, FuncId, ReturnTypeInfo ); 167 if( plpRetIndex ){ 168 *plpRetIndex = ReturnTypeInfo.u.lpIndex; 169 } 170 return ReturnTypeInfo.type; 171 } 172 else if(idProc==PROC_PTR){ 168 int FuncId = (int)(_int64)pProc; 169 170 if( !Opcode_CallFunc( lpszParms, FuncId, resultType, isCallOn ) ){ 171 return false; 172 } 173 } 174 else if(kind==PROC_PTR){ 173 175 ///////////////// 174 176 // 関数ポインタ 175 177 ///////////////// 176 178 177 LONG_PTR lpIndex; 178 GetVarType(name,&lpIndex,0); 179 180 extern PROCPTRINFO *pProcPtrInfo; 181 ret_type=Opcode_CallProcPtr(name,Parameter,&pProcPtrInfo[lpIndex],plpRetIndex); 182 } 183 184 return ret_type; 185 } 186 BOOL CallPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo){ 179 Type type; 180 GetVarType(fullCallName,type,false); 181 182 extern ProcPointer **ppProcPointer; 183 ProcPointer *pProcPtr = ppProcPointer[type.GetIndex()]; 184 resultType = pProcPtr->ReturnType(); 185 186 if( isCallOn ){ 187 if( !Opcode_CallProcPtr(fullCallName,lpszParms,pProcPtr) ){ 188 return false; 189 } 190 } 191 } 192 else{ 193 return false; 194 } 195 196 return true; 197 } 198 bool CallPropertyMethod( const char *variable, const char *rightSide, Type &resultType){ 187 199 //プロパティ用のメソッドを呼び出す 188 200 … … 197 209 198 210 //オーバーロード用の関数リストを作成 199 std::vector< SubInfo*> subs;211 std::vector<UserProc *> subs; 200 212 GetOverloadSubHash(VarName,subs); 201 213 if(subs.size()==0){ 202 return 0;214 return false; 203 215 } 204 216 205 217 //パラメータを整備 206 218 char *Parameter; 207 Parameter=(char *)HeapAlloc(hHeap,0,lstrlen(ArrayElements)+lstrlen( RightSide)+32);219 Parameter=(char *)HeapAlloc(hHeap,0,lstrlen(ArrayElements)+lstrlen(rightSide)+32); 208 220 lstrcpy(Parameter,ArrayElements); 209 if( RightSide){210 if(Parameter[0]&& RightSide[0]) lstrcat(Parameter,",");211 lstrcat(Parameter, RightSide);221 if(rightSide){ 222 if(Parameter[0]&&rightSide[0]) lstrcat(Parameter,","); 223 lstrcat(Parameter,rightSide); 212 224 } 213 225 214 226 //オーバーロードを解決 215 SubInfo *pSub;216 p Sub=OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName,NULL);217 218 if(p Sub){227 UserProc *pUserProc; 228 pUserProc=OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName); 229 230 if(pUserProc){ 219 231 //呼び出し 220 Opcode_CallProc(Parameter,pSub,0,ObjectName,RefType); 221 222 if( pRetTypeInfo ){ 223 pRetTypeInfo->type = pSub->ReturnType; 224 pRetTypeInfo->u.lpIndex = pSub->u.ReturnIndex; 225 } 232 Opcode_CallProc(Parameter,pUserProc,0,ObjectName,RefType); 233 234 resultType = pUserProc->ReturnType(); 226 235 } 227 236 228 237 HeapDefaultFree(Parameter); 229 238 230 return 1; 231 } 232 233 234 int GetReturnTypeOfProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex){ 235 int ret_type; 236 237 if(idProc==PROC_DEFAULT){ 238 ///////////////////// 239 // ユーザー定義関数 240 ///////////////////// 241 242 SubInfo *pSub; 243 pSub=(SubInfo *)pInfo; 244 245 //GetSubHash内でエラー提示が行われた場合 246 if(pSub==(SubInfo *)-1) return -1; 247 248 249 //オブジェクト名を取得 250 char ObjectName[VN_SIZE]; 251 int RefType; 252 SplitObjectName(name,ObjectName,&RefType); 253 254 255 //////////////////////// 256 // オーバーロードを解決 257 //////////////////////// 258 259 std::vector<SubInfo *> subs; 260 GetOverloadSubHash(name,subs); 261 if( subs.size() > 0 ){ 262 //オーバーロードを解決 263 pSub=OverloadSolutionWithStrParam(name,subs,Parameter,ObjectName,NULL); 264 265 if(!pSub) return 0; 266 } 267 268 269 ret_type=pSub->ReturnType; 270 *plpRetIndex=pSub->u.ReturnIndex; 271 } 272 else if(idProc==PROC_DLL){ 273 ///////////////////////// 274 // DLL関数 275 ///////////////////////// 276 DECLAREINFO *pdi; 277 pdi=(DECLAREINFO *)pInfo; 278 279 ret_type=pdi->ReturnType; 280 *plpRetIndex=pdi->u.ReturnIndex; 281 } 282 else if(idProc==PROC_BUILTIN){ 283 ///////////////////////// 284 // 組み込み関数 285 ///////////////////////// 286 int FuncId; 287 FuncId=(int)(_int64)pInfo; 288 289 ret_type=GetFunctionType(FuncId); 290 *plpRetIndex=-1; 291 } 292 else if(idProc==PROC_PTR){ 293 ///////////////// 294 // 関数ポインタ 295 ///////////////// 296 297 LONG_PTR lpIndex; 298 GetVarType(name,&lpIndex,0); 299 300 extern PROCPTRINFO *pProcPtrInfo; 301 ret_type=pProcPtrInfo[lpIndex].ReturnType; 302 *plpRetIndex=pProcPtrInfo[lpIndex].u.ReturnIndex; 303 } 304 305 return ret_type; 306 } 307 BOOL GetReturnTypeOfPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo){ 239 return true; 240 } 241 242 bool GetReturnTypeOfPropertyMethod( const char *variable, const char *rightSide, Type &resultType ){ 308 243 //プロパティ用のメソッドを呼び出す 309 244 … … 318 253 319 254 //オーバーロード用の関数リストを作成 320 std::vector< SubInfo*> subs;255 std::vector<UserProc *> subs; 321 256 GetOverloadSubHash(VarName,subs); 322 257 if(subs.size()==0){ … … 326 261 //パラメータを整備 327 262 char *Parameter; 328 Parameter=(char *)HeapAlloc(hHeap,0,lstrlen(ArrayElements)+lstrlen( RightSide)+32);263 Parameter=(char *)HeapAlloc(hHeap,0,lstrlen(ArrayElements)+lstrlen(rightSide)+32); 329 264 lstrcpy(Parameter,ArrayElements); 330 if( RightSide){331 if(Parameter[0]&& RightSide[0]) lstrcat(Parameter,",");332 lstrcat(Parameter, RightSide);265 if(rightSide){ 266 if(Parameter[0]&&rightSide[0]) lstrcat(Parameter,","); 267 lstrcat(Parameter,rightSide); 333 268 } 334 269 335 270 //オーバーロードを解決 336 SubInfo *pSub; 337 pSub=OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName,NULL); 338 339 if(pSub){ 340 if(pRetTypeInfo){ 341 pRetTypeInfo->type=pSub->ReturnType; 342 pRetTypeInfo->u.lpIndex=pSub->u.ReturnIndex; 343 } 271 UserProc *pUserProc; 272 pUserProc=OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName); 273 274 if(pUserProc){ 275 resultType = pUserProc->ReturnType(); 344 276 } 345 277 … … 348 280 349 281 //インデクサ(getter)の戻り値を取得 350 bool GetReturnTypeOfIndexerGetterProc( CClass *pobj_Class,TYPEINFO &RetTypeInfo){351 std::vector< SubInfo*> subs;352 pobj_Class->EnumMethod( CALC_ARRAY_GET, subs );282 bool GetReturnTypeOfIndexerGetterProc( const CClass &objClass, Type &resultType ){ 283 std::vector<UserProc *> subs; 284 objClass.EnumMethod( CALC_ARRAY_GET, subs ); 353 285 if( subs.size() == 0 ){ 354 286 return false; 355 287 } 356 288 357 RetTypeInfo.type = subs[0]->ReturnType; 358 RetTypeInfo.u.lpIndex = subs[0]->u.ReturnIndex; 289 resultType = subs[0]->ReturnType(); 359 290 360 291 return true; … … 362 293 363 294 364 void AddDeclareData(char *buffer,int NowLine){295 void AddDeclareData(char *buffer,int nowLine){ 365 296 extern HANDLE hHeap; 366 int i,i2,i3,i4,sw,IsFunction; 367 char temporary[VN_SIZE]; 368 369 i=0; 370 371 DWORD dwType; 372 BOOL bCdecl=0; 373 374 //Static/Dynamic 375 if(buffer[i]==ESC_STATIC){ 376 dwType=DECLARE_STATIC; 377 i++; 378 } 379 else dwType=DECLARE_DYNAMIC; 297 int i2; 298 299 int i=0; 380 300 381 301 //Sub/Function 382 if(buffer[i]==ESC_SUB) IsFunction=0; 383 else if(buffer[i]==ESC_FUNCTION) IsFunction=1; 302 Procedure::Kind kind = Procedure::Sub; 303 if(buffer[i]==ESC_SUB){ 304 } 305 else if(buffer[i]==ESC_FUNCTION){ 306 kind = Procedure::Function; 307 } 384 308 else{ 385 SetError(1,NULL, NowLine);309 SetError(1,NULL,nowLine); 386 310 return; 387 311 } … … 389 313 390 314 //プロシージャ名 315 char procName[VN_SIZE]; 316 bool isCdecl = false; 391 317 for(i2=0;;i++,i2++){ 392 318 if(buffer[i]==1&&buffer[i+1]==ESC_CDECL){ 393 bCdecl=1;319 isCdecl = true; 394 320 395 321 i+=2; 396 temporary[i2]=0;322 procName[i2]=0; 397 323 break; 398 324 } 399 325 if(buffer[i]==','){ 400 temporary[i2]=0;326 procName[i2]=0; 401 327 break; 402 328 } 403 329 if(buffer[i]=='\0'){ 404 SetError(1,NULL, NowLine);330 SetError(1,NULL,nowLine); 405 331 return; 406 332 } 407 temporary[i2]=buffer[i]; 408 } 333 procName[i2]=buffer[i]; 334 } 335 i++; 409 336 410 337 //ユーザー定義関数との重複チェック 411 if(GetSubHash( temporary)){412 SetError(15, temporary,NowLine);338 if(GetSubHash(procName)){ 339 SetError(15,procName,nowLine); 413 340 return; 414 341 } 415 342 416 343 344 //ライブラリ 345 char dllFileName[MAX_PATH]; 346 i = GetOneParameter( buffer, i, dllFileName ); 347 Type resultType; 348 _int64 i64data; 349 if( !StaticCalculation( true, dllFileName, 0, &i64data, resultType ) ){ 350 return; 351 } 352 if( resultType.GetBasicType() != typeOfPtrChar ){ 353 SetError(1,NULL,nowLine); 354 return; 355 } 356 lstrcpy( dllFileName, (char *)i64data ); 357 CharUpper(dllFileName); 358 if(!strstr(dllFileName,".")){ 359 lstrcat(dllFileName,".DLL"); 360 if(lstrlen(dllFileName)>=16){ 361 SetError(7,NULL,nowLine); 362 return; 363 } 364 } 365 366 //エイリアス 367 char alias[VN_SIZE]; 368 i = GetOneParameter( buffer, i, alias ); 369 if( alias[0] ){ 370 if( !StaticCalculation( true, alias, 0, &i64data, resultType ) ){ 371 return; 372 } 373 if( resultType.GetBasicType() != typeOfPtrChar ){ 374 SetError(1,NULL,nowLine); 375 return; 376 } 377 lstrcpy( alias, (char *)i64data ); 378 } 379 else{ 380 //省略されたときは関数名 381 lstrcpy( alias, procName ); 382 } 383 384 385 // オブジェクトを生成 386 DllProc *pDllProc = new DllProc( procName, kind, isCdecl, dllFileName, alias ); 387 388 // パラメータを解析 389 // ※第1パラメータにに指定するデータの例:"( s As String ) As String" 390 pDllProc->SetParamsAndReturnType( buffer + i, nowLine ); 391 392 // パラメータのエラーチェック 393 foreach( const Parameter *pParam, pDllProc->Params() ){ 394 if( pParam->IsObject() ){ 395 SetError(25,pParam->GetVarName(),nowLine); 396 } 397 if( !pParam->IsRef() ){ 398 if( pParam->IsStruct() ){ 399 SetError(28,pParam->GetVarName(),nowLine); 400 } 401 } 402 } 403 404 //戻り値のエラーチェック 405 if( pDllProc->IsFunction() ){ 406 // Function定義 407 408 if( pDllProc->ReturnType().IsObject() ){ 409 // DLL関数ではオブジェクトを戻り値にできない 410 SetError(40,pDllProc->GetName(),nowLine); 411 } 412 } 413 414 417 415 ///////////////////////////////// 418 // 格納位置を計算してp ciにセット416 // 格納位置を計算してppDeclareHashにセット 419 417 ///////////////////////////////// 420 418 421 419 //ハッシュ値を取得 422 420 int key; 423 key=hash_default(temporary); 424 425 extern DECLAREINFO **ppDeclareHash; 426 DECLAREINFO *pdi; 421 key=hash_default(procName); 422 423 extern DllProc **ppDeclareHash; 427 424 if(ppDeclareHash[key]){ 428 pdi=ppDeclareHash[key]; 425 DllProc *pTempProc; 426 pTempProc=ppDeclareHash[key]; 429 427 while(1){ 430 if( lstrcmpi(pdi->name,temporary)==0){428 if( pDllProc->GetName() == pTempProc->GetName() ){ 431 429 //重複エラー 432 SetError(15, temporary,NowLine);430 SetError(15,procName,nowLine); 433 431 return; 434 432 } 435 433 436 if(p di->pNextData==0){437 p di->pNextData=(DECLAREINFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(DECLAREINFO));434 if(pTempProc->pNextData==0){ 435 pTempProc->pNextData=pDllProc; 438 436 break; 439 437 } 440 p di=pdi->pNextData;441 } 442 p di=pdi->pNextData;438 pTempProc=pTempProc->pNextData; 439 } 440 pTempProc=pTempProc->pNextData; 443 441 } 444 442 else{ 445 ppDeclareHash[key]=(DECLAREINFO *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,sizeof(DECLAREINFO)); 446 pdi=ppDeclareHash[key]; 447 } 448 449 pdi->dwType=dwType; 450 pdi->bCdecl=bCdecl; 451 452 pdi->name=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1); 453 lstrcpy(pdi->name,temporary); 443 ppDeclareHash[key]=pDllProc; 444 } 445 } 446 447 UserProc *AddSubData(char *buffer,int nowLine,BOOL bVirtual,CClass *pobj_c, bool isStatic){ 448 int i2,i3; 449 char temporary[8192]; 450 451 int i=1; 452 453 UserProc::Kind kind = Procedure::Sub; 454 bool isMacro = false; 455 if(buffer[i]==ESC_FUNCTION) kind = Procedure::Function; 456 if(buffer[i]==ESC_MACRO){ 457 isMacro = true; 458 } 459 454 460 i++; 455 461 456 //ライブラリ 457 i = GetOneParameter( buffer, i, temporary ); 458 int type; 459 LONG_PTR lpIndex; 460 _int64 i64data; 461 type = StaticCalculation( true, temporary, 0, &i64data, &lpIndex ); 462 if( type != typeOfPtrChar ){ 463 SetError(1,NULL,NowLine); 464 return; 465 } 466 lstrcpy( temporary, (char *)i64data ); 467 CharUpper(temporary); 468 if(!strstr(temporary,".")){ 469 if(pdi->dwType==DECLARE_STATIC) lstrcat(temporary,".LIB"); 470 else{ 471 lstrcat(temporary,".DLL"); 472 if(lstrlen(temporary)>=16){ 473 SetError(7,NULL,NowLine); 474 return; 475 } 476 } 477 } 478 pdi->file=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1); 479 lstrcpy(pdi->file,temporary); 480 481 //エイリアス 482 i = GetOneParameter( buffer, i, temporary ); 483 if( temporary[0] ){ 484 type = StaticCalculation( true, temporary, 0, &i64data, &lpIndex ); 485 if( type != typeOfPtrChar ){ 486 SetError(1,NULL,NowLine); 487 return; 488 } 489 lstrcpy( temporary, (char *)i64data ); 490 491 pdi->alias=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1); 492 lstrcpy(pdi->alias,temporary); 493 } 494 else{ 495 //省略されたときは関数名 496 pdi->alias=(char *)HeapAlloc(hHeap,0,lstrlen(pdi->name)+1); 497 lstrcpy(pdi->alias,pdi->name); 498 } 499 500 //パラメータの始めのカッコ 501 if(buffer[i]!='('){ 502 SetError(1,NULL,NowLine); 503 return; 504 } 505 i++; 506 507 pdi->pParmInfo=(PARAMETER_INFO *)HeapAlloc(hHeap,0,1); 508 509 //各パラメータ 510 for(i3=0;;i3++){ 511 if(buffer[i]==')') break; 512 513 pdi->pParmInfo=(PARAMETER_INFO *)HeapReAlloc(hHeap,0,pdi->pParmInfo,(i3+1)*sizeof(PARAMETER_INFO)); 514 515 //ByVal 516 if(buffer[i]==1&&buffer[i+1]==ESC_BYVAL){ 517 pdi->pParmInfo[i3].bByVal=1; 462 bool isCdecl = false; 463 bool isExport = false; 464 while(1){ 465 if(buffer[i]==1&&buffer[i+1]==ESC_CDECL&& isCdecl == false ){ 466 isCdecl = true; 467 518 468 i+=2; 519 469 } 520 else if(buffer[i]==1&&buffer[i+1]==ESC_BYREF){ 521 pdi->pParmInfo[i3].bByVal=0; 522 i+=2; 523 } 524 else pdi->pParmInfo[i3].bByVal=1; 525 526 //変数名は無視(temporaryの変数名は型宣言文字判断のため) 527 sw=0; 528 for(i2=0;;i++,i2++){ 529 if(buffer[i]=='('){ 530 if(!sw) sw=1; 531 532 i4=GetStringInPare(temporary+i2,buffer+i); 533 i2+=i4-1; 534 i+=i4-1; 535 continue; 536 } 537 if(buffer[i]=='['){ 538 if(!sw) sw=1; 539 540 i4=GetStringInBracket(temporary+i2,buffer+i); 541 i2+=i4-1; 542 i+=i4-1; 543 continue; 544 } 545 if(!IsVariableChar(buffer[i])){ 546 temporary[i2]=0; 547 break; 548 } 549 temporary[i2]=buffer[i]; 550 } 551 if(lstrcmp(temporary,"...")==0) pdi->pParmInfo[i3].type=DEF_ELLIPSE; 552 else{ 553 //型 554 if(buffer[i]==1&&buffer[i+1]==ESC_AS){ 555 i+=2; 556 for(i2=0;;i++,i2++){ 557 if(!(IsVariableChar(buffer[i])||buffer[i]=='*')){ 558 temporary[i2]=0; 559 break; 560 } 561 temporary[i2]=buffer[i]; 562 } 563 pdi->pParmInfo[i3].type=GetTypeFixed(temporary,&pdi->pParmInfo[i3].u.index); 564 } 565 else{ 566 pdi->pParmInfo[i3].type=GetTypeFromSimpleName(temporary); 567 SetError(-103,temporary,NowLine); 568 } 569 570 if(sw){ 571 //配列ポインタを引き渡すとき 572 pdi->pParmInfo[i3].type=GetPtrType(pdi->pParmInfo[i3].type,pdi->pParmInfo[i3].u.index); 573 } 574 } 575 576 //名前はダミー(使用しないため) 577 pdi->pParmInfo[i3].name=""; 578 579 //構造体の場合はエラーチェック 580 if(pdi->pParmInfo[i3].type==-1) SetError(3,temporary,NowLine); 581 if(pdi->pParmInfo[i3].type==DEF_OBJECT){ 582 if(pdi->pParmInfo[i3].bByVal) pdi->pParmInfo[i3].type=DEF_LONG;//SetError(28,temporary,NowLine); 583 } 584 585 //構造体アドレスの空白部 586 while(buffer[i]==' ') i++; 587 588 if(buffer[i]==','){ 589 i++; 590 continue; 591 } 592 else if(buffer[i]==')') continue; 593 else{ 594 SetError(1,NULL,NowLine); 595 break; 596 } 597 } 598 pdi->ParmNum=i3; 599 600 //戻り値 601 i++; 602 if(buffer[i]==1&&buffer[i+1]==ESC_AS){ 603 if(IsFunction==0) SetError(1,NULL,NowLine); 604 i+=2; 605 pdi->ReturnType=GetTypeFixed(buffer+i,&pdi->u.ReturnIndex); 606 if(pdi->ReturnType==DEF_NON) SetError(3,buffer+i,NowLine); 607 if(pdi->ReturnType==DEF_OBJECT) SetError(40,NULL,NowLine); 608 } 609 else if(buffer[i]) SetError(1,NULL,NowLine); 610 else pdi->ReturnType=DEF_NON; 611 612 pdi->pos=NowLine; 613 } 614 615 BOOL CompareParameter(PARAMETER_INFO *ppi1,int pi_num1,PARAMETER_INFO *ppi2,int pi_num2){ 616 if(pi_num1!=pi_num2) return 1; 617 618 int i; 619 for(i=0;i<pi_num1;i++){ 620 if(ppi1[i].type!=ppi2[i].type){ 621 622 if(ppi1[i].bByVal==0&&ppi1[i].type==DEF_ANY&& 623 ppi2[i].bByVal==1&&IsPtrType(ppi2[i].type)|| 624 ppi1[i].bByVal==1&&IsPtrType(ppi1[i].type)&& 625 ppi2[i].bByVal==0&&ppi2[i].type==DEF_ANY){ 626 /* ByRef var As Any 627 と 628 var As VoidPtr 629 は同等 630 */ 631 continue; 632 } 633 634 return 1; 635 } 636 else{ 637 if(NATURAL_TYPE(ppi1[i].type)==DEF_OBJECT 638 || NATURAL_TYPE(ppi1[i].type)==DEF_STRUCT ){ 639 if(ppi1[i].u.index!=ppi2[i].u.index) return 1; 640 } 641 } 642 } 643 644 return 0; 645 } 646 SubInfo *AddSubData(char *buffer,int NowLine,BOOL bVirtual,CClass *pobj_c,BOOL bStatic){ 647 int i,i2,i3,sw; 648 DWORD dwType; 649 char temporary[8192],temp2[VN_SIZE]; 650 651 i=1; 652 if(buffer[i]==ESC_SUB) dwType=SUBTYPE_SUB; 653 else if(buffer[i]==ESC_FUNCTION) dwType=SUBTYPE_FUNCTION; 654 else if(buffer[i]==ESC_MACRO) dwType=SUBTYPE_MACRO; 655 656 i++; 657 658 BOOL bExport=0,bCdecl=0; 659 while(1){ 660 if(buffer[i]==1&&buffer[i+1]==ESC_EXPORT&&bExport==0){ 661 bExport=1; 662 663 i+=2; 664 } 665 else if(buffer[i]==1&&buffer[i+1]==ESC_CDECL&&bCdecl==0){ 666 bCdecl=1; 470 else if(buffer[i]==1&&buffer[i+1]==ESC_EXPORT&& isExport == false ){ 471 isExport = true; 667 472 668 473 i+=2; … … 674 479 if(buffer[i]==1&&buffer[i+1]==ESC_OPERATOR){ 675 480 if(!pobj_c){ 676 SetError(126,NULL, NowLine);481 SetError(126,NULL,nowLine); 677 482 return 0; 678 483 } … … 708 513 } 709 514 if(!iCalcId){ 710 SetError(1,NULL, NowLine);515 SetError(1,NULL,nowLine); 711 516 return 0; 712 517 } … … 735 540 } 736 541 737 if( dwType==SUBTYPE_MACRO){542 if( isMacro ){ 738 543 //大文字に変換 739 544 CharUpper(temporary); … … 753 558 754 559 if(GetDeclareHash(temporary)){ 755 SetError(15,temporary, NowLine);560 SetError(15,temporary,nowLine); 756 561 return 0; 757 562 } … … 761 566 SubNum++; 762 567 763 SubInfo *pSub = new SubInfo(); 764 765 //クラス名 766 pSub->pobj_ParentClass=pobj_c; 568 569 UserProc *pUserProc = new UserProc( temporary, kind, isMacro, isCdecl, isExport ); 570 pUserProc->SetParentClass( pobj_c ); 767 571 768 572 //ID 769 573 static int id_base=0; 770 pSub->id=(id_base++); 771 772 //関数名 773 pSub->name=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1); 774 lstrcpy(pSub->name,temporary); 775 776 //ソースコードの位置 777 pSub->address=NowLine; 778 779 pSub->bExport=bExport; 780 pSub->bCdecl=bCdecl; 781 pSub->bVirtual=bVirtual; 782 if(bExport) pSub->bUse=1; 783 else pSub->bUse=0; 784 pSub->bCompile=0; 785 pSub->bSystem=0; 786 787 pSub->dwType=dwType; 788 789 790 if(pSub->dwType==SUBTYPE_FUNCTION){ 791 /////////////////// 792 // 戻り値を取得 793 /////////////////// 794 795 pSub->isReturnRef = false; 796 797 if(pobj_c){ 798 if(lstrcmp(pSub->name,pobj_c->name)==0|| 799 pSub->name[0]=='~'){ 800 //クラスのコンストラクタ、デストラクタがFunction定義の場合はエラーをだす 801 SetError(115,NULL,NowLine); 802 } 803 } 804 805 806 i2=lstrlen(buffer)-2; 807 808 int sw_as=0; 809 for(;i2>0;i2--){ 810 if(buffer[i2]==')') break; 811 812 if(buffer[i2]==1&&buffer[i2+1]==ESC_AS){ 813 if( buffer[i2-2] == 1 && buffer[i2-1] == ESC_BYREF ){ 814 //参照型 815 pSub->isReturnRef = true; 816 } 817 818 i2+=2; 819 i3=0; 820 while(buffer[i2]=='*') temporary[i3++]=buffer[i2++]; 821 for(;;i2++,i3++){ 822 if(!IsVariableChar(buffer[i2])){ 823 temporary[i3]=0; 824 break; 825 } 826 temporary[i3]=buffer[i2]; 827 } 828 pSub->ReturnType=GetTypeFixed(temporary,&pSub->u.ReturnIndex); 829 if(pSub->ReturnType==DEF_NON) SetError(3,temporary,NowLine); 830 831 sw_as=1; 832 break; 833 } 834 } 835 836 if(!sw_as){ 837 SetError(-104,pSub->name,NowLine); 838 839 pSub->ReturnType=DEF_DOUBLE; 840 } 841 } 842 else{ 843 //戻り値なしのSub定義 844 pSub->ReturnType=DEF_NON; 845 pSub->u.ReturnIndex=-1; 846 } 847 848 //パラメータ 849 if(buffer[i]!='('){ 850 SetError(1,NULL,NowLine); 851 return 0; 852 } 853 i++; 854 if(buffer[i]!=')'&&pobj_c){ 855 //クラスのメンバ関数の場合のみ、デストラクタにパラメータがある場合にエラーをだす 856 if(pSub->name[0]=='~'){ 857 SetError(114,NULL,NowLine); 858 i=JumpStringInPare(buffer,i); 859 } 860 } 861 while(1){ 862 if(buffer[i]==')') break; 863 864 //ByRef 865 bool isRef; 866 if(buffer[i]==1&&buffer[i+1]==ESC_BYVAL){ 867 isRef = false; 868 i+=2; 869 } 870 else if(buffer[i]==1&&buffer[i+1]==ESC_BYREF){ 871 isRef = true; 872 i+=2; 873 } 874 else isRef = false; 875 876 //パラメータ名 877 bool isArray = false; 878 int subScripts[MAX_ARRAYDIM]; 879 char name[VN_SIZE]; 880 sw=0; 881 for(i2=0;;i++,i2++){ 882 if(buffer[i]=='('){ 883 if(!sw) sw=1; 884 885 i3=GetStringInPare(name+i2,buffer+i); 886 i2+=i3-1; 887 i+=i3-1; 888 continue; 889 } 890 if(buffer[i]=='['){ 891 if(!sw) sw=1; 892 893 i3=GetStringInBracket(name+i2,buffer+i); 894 i2+=i3-1; 895 i+=i3-1; 896 continue; 897 } 898 if(!IsVariableChar(buffer[i])){ 899 name[i2]=0; 900 break; 901 } 902 name[i2]=buffer[i]; 903 } 904 if(sw){ 905 //配列パラメータ 906 if( isRef == false ) SetError(29,NULL,NowLine); 907 isArray = true; 908 909 if((name[i2-2]=='('&&name[i2-1]==')')|| 910 (name[i2-2]=='['&&name[i2-1]==']')){ 911 subScripts[0]=LONG_MAX; 912 subScripts[1]=-1; 913 914 name[i2-2]=0; 915 } 916 else{ 917 GetArrange(name,temp2,subScripts); 918 lstrcpy(name,temp2); 919 } 920 921 i2=lstrlen(name); 922 } 923 924 //型 925 Type type( DEF_NON ); 926 if(buffer[i]==1&&buffer[i+1]==ESC_AS){ 927 i+=2; 928 929 i2=0; 930 while(buffer[i]=='*'){ 931 temporary[i2]=buffer[i]; 932 i++; 933 i2++; 934 } 935 for(;;i++,i2++){ 936 if(!IsVariableChar(buffer[i])){ 937 if(buffer[i]==1&&(buffer[i+1]==ESC_FUNCTION||buffer[i+1]==ESC_SUB)){ 938 temporary[i2++]=buffer[i++]; 939 temporary[i2]=buffer[i]; 940 continue; 941 } 942 temporary[i2]=0; 943 break; 944 } 945 temporary[i2]=buffer[i]; 946 } 947 948 Type::StringToType( temporary, type ); 949 950 if(temporary[0]=='*'&& 951 temporary[1]==1&& 952 (temporary[2]==ESC_FUNCTION||temporary[2]==ESC_SUB)){ 953 if(buffer[i]!='('){ 954 SetError(10,temporary,NowLine); 955 break; 956 } 957 i3=GetStringInPare(temporary+i2,buffer+i); 958 i+=i3; 959 i2+=i3; 960 961 if(temporary[2]==ESC_FUNCTION&&buffer[i]==1&&buffer[i+1]==ESC_AS){ 962 temporary[i2++]=buffer[i++]; 963 temporary[i2++]=buffer[i++]; 964 for(;;i++,i2++){ 965 if(!IsVariableChar(buffer[i])){ 966 temporary[i2]=0; 967 break; 968 } 969 temporary[i2]=buffer[i]; 970 } 971 } 972 } 973 else{ 974 //TypeDefをする前のベース型を取得 975 GetOriginalTypeName(temporary); 976 } 977 978 if( type.IsNull() ){ 979 SetError(3,temporary,NowLine); 980 type.SetBasicType( DEF_PTR_VOID ); 981 } 982 } 983 else{ 984 type.SetBasicType( GetTypeFromSimpleName(temporary) ); 985 SetError(-103,temporary,NowLine); 986 } 987 988 if( type.IsProcPtr() ){ 989 //関数ポインタの場合 990 type.SetIndex( AddProcPtrInfo(temporary+3,temporary[2]) ); 991 } 992 993 Parameter *pParam = new Parameter( name, type, isRef ); 994 if( isArray ){ 995 pParam->SetArray( subScripts ); 996 } 997 998 //パラメータを追加 999 pSub->params.push_back( pParam ); 1000 1001 if(buffer[i]==','){ 1002 i++; 1003 continue; 1004 } 1005 else if(buffer[i]==')') continue; 1006 else{ 1007 SetError(1,NULL,NowLine); 1008 break; 1009 } 1010 } 1011 pSub->SecondParmNum = (int)pSub->params.size(); 1012 i++; 1013 if(buffer[i]=='('){ 1014 i++; 1015 while(1){ 1016 if(buffer[i]==')') break; 1017 1018 //ByRef 1019 bool isRef; 1020 if(buffer[i]==1&&buffer[i+1]==ESC_BYVAL){ 1021 isRef = false; 1022 i+=2; 1023 } 1024 else if(buffer[i]==1&&buffer[i+1]==ESC_BYREF){ 1025 isRef = true; 1026 i+=2; 1027 } 1028 else isRef = false; 1029 1030 //パラメータ名 1031 bool isArray = false; 1032 int subScripts[MAX_ARRAYDIM]; 1033 char name[VN_SIZE]; 1034 sw=0; 1035 for(i2=0;;i++,i2++){ 1036 if(buffer[i]=='('){ 1037 if(!sw) sw=1; 1038 1039 i3=GetStringInPare(name+i2,buffer+i); 1040 i2+=i3-1; 1041 i+=i3-1; 1042 continue; 1043 } 1044 if(buffer[i]=='['){ 1045 if(!sw) sw=1; 1046 1047 i3=GetStringInBracket(name+i2,buffer+i); 1048 i2+=i3-1; 1049 i+=i3-1; 1050 continue; 1051 } 1052 if(!IsVariableChar(buffer[i])){ 1053 name[i2]=0; 1054 break; 1055 } 1056 name[i2]=buffer[i]; 1057 } 1058 if(sw){ 1059 //配列パラメータ 1060 if( isRef == false ) SetError(29,NULL,NowLine); 1061 isArray = true; 1062 1063 if((name[i2-2]=='('&&name[i2-1]==')')|| 1064 (name[i2-2]=='['&&name[i2-1]==']')){ 1065 subScripts[0]=LONG_MAX; 1066 subScripts[1]=-1; 1067 1068 name[i2-2]=0; 1069 } 1070 else{ 1071 GetArrange(name,temp2,subScripts); 1072 lstrcpy(name,temp2); 1073 } 1074 1075 i2=lstrlen(name); 1076 } 1077 1078 //型 1079 Type type( DEF_NON ); 1080 if(buffer[i]==1&&buffer[i+1]==ESC_AS){ 1081 i+=2; 1082 1083 i2=0; 1084 while(buffer[i]=='*'){ 1085 temporary[i2]=buffer[i]; 1086 i++; 1087 i2++; 1088 } 1089 for(;;i++,i2++){ 1090 if(!IsVariableChar(buffer[i])){ 1091 if(buffer[i]==1&&(buffer[i+1]==ESC_FUNCTION||buffer[i+1]==ESC_SUB)){ 1092 temporary[i2++]=buffer[i++]; 1093 temporary[i2]=buffer[i]; 1094 continue; 1095 } 1096 temporary[i2]=0; 1097 break; 1098 } 1099 temporary[i2]=buffer[i]; 1100 } 1101 1102 Type::StringToType( temporary, type ); 1103 1104 if(temporary[0]=='*'&& 1105 temporary[1]==1&& 1106 (temporary[2]==ESC_FUNCTION||temporary[2]==ESC_SUB)){ 1107 if(buffer[i]!='('){ 1108 SetError(10,temporary,NowLine); 1109 break; 1110 } 1111 i3=GetStringInPare(temporary+i2,buffer+i); 1112 i+=i3; 1113 i2+=i3; 1114 1115 if(temporary[2]==ESC_FUNCTION&&buffer[i]==1&&buffer[i+1]==ESC_AS){ 1116 temporary[i2++]=buffer[i++]; 1117 temporary[i2++]=buffer[i++]; 1118 for(;;i++,i2++){ 1119 if(!IsVariableChar(buffer[i])){ 1120 temporary[i2]=0; 1121 break; 1122 } 1123 temporary[i2]=buffer[i]; 1124 } 1125 } 1126 } 1127 else{ 1128 //TypeDefをする前のベース型を取得 1129 GetOriginalTypeName(temporary); 1130 } 1131 1132 if( type.IsNull() ){ 1133 SetError(3,temporary,NowLine); 1134 type.SetBasicType( DEF_PTR_VOID ); 1135 } 1136 } 1137 else{ 1138 type.SetBasicType( GetTypeFromSimpleName(temporary) ); 1139 SetError(-103,temporary,NowLine); 1140 } 1141 1142 if( type.IsProcPtr() ){ 1143 //関数ポインタの場合 1144 type.SetIndex( AddProcPtrInfo(temporary+3,temporary[2]) ); 1145 } 1146 1147 Parameter *pParam = new Parameter( name, type, isRef ); 1148 if( isArray ){ 1149 pParam->SetArray( subScripts ); 1150 } 1151 1152 //パラメータを追加 1153 pSub->params.push_back( pParam ); 1154 1155 if(buffer[i]==','){ 1156 i++; 1157 continue; 1158 } 1159 else if(buffer[i]==')') continue; 1160 else{ 1161 SetError(1,NULL,NowLine); 1162 break; 1163 } 1164 } 1165 i++; 1166 } 1167 1168 //リアルパラメータ領域を取得(_System_LocalThisを考慮して2つだけ多く確保する場合がある) 1169 1170 if(pobj_c&&bStatic==0){ 1171 //オブジェクトメンバの場合は、第一パラメータを_System_LocalThis引き渡し用として利用 1172 string name = "_System_LocalThis"; 1173 Type type( DEF_PTR_VOID ); 1174 pSub->realParams.push_back( new Parameter( name, type ) ); 1175 } 1176 1177 if(pSub->ReturnType==DEF_STRUCT){ 1178 //構造体を戻り値として持つ場合 1179 //※第一パラメータ(Thisポインタありの場合は第二パラメータ)を戻り値用の参照宣言にする 1180 1181 string name = pSub->name; 1182 if(pSub->name[0]==1&&pSub->name[1]==ESC_OPERATOR){ 1183 name="_System_ReturnValue"; 1184 } 1185 Type type( DEF_STRUCT, pSub->u.ReturnIndex ); 1186 pSub->realParams.push_back( new Parameter( name, type, true ) ); 1187 } 1188 1189 //パラメータをコピー 1190 foreach( Parameter *pParam, pSub->params ){ 1191 pSub->realParams.push_back( new Parameter( *pParam ) ); 1192 } 574 pUserProc->id = (id_base++); 575 576 if(isExport){ 577 pUserProc->Using(); 578 } 579 580 // パラメータを解析 581 // ※第1パラメータにに指定するデータの例:"( s As String ) As String" 582 pUserProc->SetParamsAndReturnType( buffer + i, nowLine, isStatic ); 1193 583 1194 584 … … 1198 588 1199 589 int key; 1200 key=hash_default(p Sub->name);1201 1202 extern SubInfo**ppSubHash;590 key=hash_default(pUserProc->GetName().c_str()); 591 592 extern UserProc **ppSubHash; 1203 593 if(ppSubHash[key]){ 1204 SubInfo*psi2;594 UserProc *psi2; 1205 595 psi2=ppSubHash[key]; 1206 596 while(1){ 1207 if(pobj_c==psi2-> pobj_ParentClass){597 if(pobj_c==psi2->GetParentClassPtr()){ 1208 598 //重複エラーチェックを行う 1209 if( lstrcmp(psi2->name,pSub->name)==0){1210 if( Parameter::Equals( psi2-> params, pSub->params) ){1211 SetError(15,p Sub->name,NowLine);599 if( pUserProc->GetName() == psi2->GetName() ){ 600 if( Parameter::Equals( psi2->Params(), pUserProc->Params() ) ){ 601 SetError(15,pUserProc->GetName().c_str(),nowLine); 1212 602 return 0; 1213 603 } … … 1218 608 psi2=psi2->pNextData; 1219 609 } 1220 psi2->pNextData=p Sub;610 psi2->pNextData=pUserProc; 1221 611 } 1222 612 else{ 1223 ppSubHash[key]=p Sub;1224 } 1225 1226 return p Sub;613 ppSubHash[key]=pUserProc; 614 } 615 616 return pUserProc; 1227 617 } 1228 618 … … 1234 624 1235 625 //Declare(DLL関数)情報を初期化 1236 extern D ECLAREINFO**ppDeclareHash;1237 ppDeclareHash=(D ECLAREINFO **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(DECLAREINFO*));626 extern DllProc **ppDeclareHash; 627 ppDeclareHash=(DllProc **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(DllProc *)); 1238 628 1239 629 //サブルーチン(ユーザー定義)情報を初期化 1240 extern SubInfo**ppSubHash;630 extern UserProc **ppSubHash; 1241 631 extern int SubNum; 1242 ppSubHash=( SubInfo **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(SubInfo*));632 ppSubHash=(UserProc **)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,MAX_HASH*sizeof(UserProc *)); 1243 633 SubNum=0; 1244 634 … … 1334 724 AddSubData(temporary,0,0,0); 1335 725 } 1336 void Delete_si(SubInfo *pSub){ 1337 foreach( Parameter *pParam, pSub->params ){ 1338 delete pParam; 1339 } 1340 1341 foreach( Parameter *pParam, pSub->realParams ){ 1342 delete pParam; 1343 } 1344 1345 if(pSub->pNextData) Delete_si(pSub->pNextData); 1346 1347 HeapDefaultFree(pSub->name); 1348 delete pSub; 1349 } 1350 void DeleteSubInfo(SubInfo **ppSubHash,char **ppMacroNames,int MacroNum){ //サブルーチン情報のメモリ解放 726 void Delete_si(UserProc *pUserProc){ 727 if(pUserProc->pNextData) Delete_si(pUserProc->pNextData); 728 delete pUserProc; 729 } 730 void DeleteSubInfo(UserProc **ppSubHash,char **ppMacroNames,int MacroNum){ //サブルーチン情報のメモリ解放 1351 731 int i; 1352 732 for(i=0;i<MAX_HASH;i++){ … … 1365 745 } 1366 746 } 1367 void Delete_di(DECLAREINFO *pdi){ 1368 if(pdi->pParmInfo) HeapDefaultFree(pdi->pParmInfo); 1369 1370 HeapDefaultFree(pdi->name); 1371 if(pdi->file) HeapDefaultFree(pdi->file); 1372 if(pdi->alias) HeapDefaultFree(pdi->alias); 1373 1374 if(pdi->pNextData) Delete_di(pdi->pNextData); 1375 1376 HeapDefaultFree(pdi); 747 void Delete_di(DllProc *pDllProc){ 748 if(pDllProc->pNextData) Delete_di(pDllProc->pNextData); 749 750 delete pDllProc; 1377 751 } 1378 752 void DeleteDeclareInfo(void){ 1379 753 //DLL情報を解放 1380 extern D ECLAREINFO**ppDeclareHash;754 extern DllProc **ppDeclareHash; 1381 755 int i; 1382 756 for(i=0;i<MAX_HASH;i++){ … … 1394 768 /////////////////////// 1395 769 1396 int AddProcPtrInfo(char *buffer,DWORD dwProcType){ 1397 extern HANDLE hHeap; 1398 extern int cp; 1399 extern PROCPTRINFO *pProcPtrInfo; 770 int AddProcPtrInfo( char *buffer, DWORD dwProcType, int nowLine ){ 771 772 Procedure::Kind kind = Procedure::Sub; 773 if( dwProcType == ESC_FUNCTION ){ 774 kind = Procedure::Function; 775 } 776 777 ProcPointer *pProcPointer = new ProcPointer( kind ); 778 779 //buffer[0]は'('となっている 780 pProcPointer->SetParamsAndReturnType( buffer, nowLine ); 781 782 extern ProcPointer **ppProcPointer; 1400 783 extern int ProcPtrInfoNum; 1401 int i,i2,i3,sw; 1402 PROCPTRINFO *pi; 1403 char temporary[VN_SIZE],temp2[VN_SIZE]; 1404 1405 pProcPtrInfo=(PROCPTRINFO *)HeapReAlloc(hHeap,0,pProcPtrInfo,(ProcPtrInfoNum+1)*sizeof(PROCPTRINFO)); 1406 pi=&pProcPtrInfo[ProcPtrInfoNum]; 784 ppProcPointer=(ProcPointer **)HeapReAlloc(hHeap,0,ppProcPointer,(ProcPtrInfoNum+1)*sizeof(ProcPointer *)); 785 ppProcPointer[ProcPtrInfoNum] = pProcPointer; 1407 786 ProcPtrInfoNum++; 1408 787 1409 pi->pParmInfo=(PARAMETER_INFO *)HeapAlloc(hHeap,0,1);1410 pi->ParmNum=0;1411 1412 //buffer[0]は'('となっている1413 i=1;1414 1415 while(1){1416 if(buffer[i]==')') break;1417 1418 pi->pParmInfo=(PARAMETER_INFO *)HeapReAlloc(hHeap,0,pi->pParmInfo,(pi->ParmNum+1)*sizeof(PARAMETER_INFO));1419 1420 //ByVal1421 if(buffer[i]==1&&buffer[i+1]==ESC_BYVAL){1422 pi->pParmInfo[pi->ParmNum].bByVal=1;1423 i+=2;1424 }1425 else if(buffer[i]==1&&buffer[i+1]==ESC_BYREF){1426 pi->pParmInfo[pi->ParmNum].bByVal=0;1427 i+=2;1428 }1429 else pi->pParmInfo[pi->ParmNum].bByVal=1;1430 1431 //パラメータ名1432 sw=0;1433 for(i2=0;;i++,i2++){1434 if(buffer[i]=='('){1435 if(!sw) sw=1;1436 1437 i3=GetStringInPare(temporary+i2,buffer+i);1438 i2+=i3-1;1439 i+=i3-1;1440 continue;1441 }1442 if(buffer[i]=='['){1443 if(!sw) sw=1;1444 1445 i3=GetStringInBracket(temporary+i2,buffer+i);1446 i2+=i3-1;1447 i+=i3-1;1448 continue;1449 }1450 if(!IsVariableChar(buffer[i])){1451 temporary[i2]=0;1452 break;1453 }1454 temporary[i2]=buffer[i];1455 }1456 pi->pParmInfo[pi->ParmNum].name=0;1457 1458 if(sw){1459 //配列パラメータ1460 if(pi->pParmInfo[pi->ParmNum].bByVal) SetError(29,NULL,cp);1461 pi->pParmInfo[pi->ParmNum].bArray=1;1462 1463 if((temporary[i2-2]=='('&&temporary[i2-1]==')')||1464 (temporary[i2-2]=='['&&temporary[i2-1]==']')){1465 pi->pParmInfo[pi->ParmNum].SubScripts[0]=LONG_MAX;1466 pi->pParmInfo[pi->ParmNum].SubScripts[1]=-1;1467 1468 temporary[i2-2]=0;1469 }1470 else{1471 GetArrange(temporary,temp2,pi->pParmInfo[pi->ParmNum].SubScripts);1472 lstrcpy(temporary,temp2);1473 }1474 1475 i2=lstrlen(temporary);1476 }1477 else{1478 pi->pParmInfo[pi->ParmNum].bArray=0;1479 pi->pParmInfo[pi->ParmNum].SubScripts[0]=-1;1480 }1481 1482 //型1483 if(buffer[i]==1&&buffer[i+1]==ESC_AS){1484 i+=2;1485 1486 i2=0;1487 while(buffer[i]=='*'){1488 temporary[i2]=buffer[i];1489 i++;1490 i2++;1491 }1492 for(;;i++,i2++){1493 if(!IsVariableChar(buffer[i])){1494 temporary[i2]=0;1495 break;1496 }1497 temporary[i2]=buffer[i];1498 }1499 1500 pi->pParmInfo[pi->ParmNum].type=1501 GetTypeFixed(temporary,&pi->pParmInfo[pi->ParmNum].u.index);1502 if(pi->pParmInfo[pi->ParmNum].type==-1){1503 SetError(3,temporary,cp);1504 pi->pParmInfo[pi->ParmNum].type=DEF_PTR_VOID;1505 }1506 if(pi->pParmInfo[pi->ParmNum].type==DEF_OBJECT){1507 if(pi->pParmInfo[pi->ParmNum].bByVal) SetError(28,temporary,cp);1508 }1509 }1510 else{1511 pi->pParmInfo[pi->ParmNum].type=GetTypeFromSimpleName(temporary);1512 SetError(-103,temporary,cp);1513 }1514 1515 pi->ParmNum++;1516 1517 if(buffer[i]==','){1518 i++;1519 continue;1520 }1521 else if(buffer[i]==')') continue;1522 else{1523 SetError(1,NULL,cp);1524 return 0;1525 }1526 }1527 i++;1528 1529 //戻り値1530 if(dwProcType==ESC_FUNCTION){1531 if(buffer[i]==1&&buffer[i+1]==ESC_AS){1532 i+=2;1533 i2=0;1534 if(buffer[i]=='*') temporary[i2++]=buffer[i++];1535 for(;;i++,i2++){1536 if(!IsVariableChar(buffer[i])){1537 temporary[i2]=0;1538 break;1539 }1540 temporary[i2]=buffer[i];1541 }1542 pi->ReturnType=GetTypeFixed(temporary,&pi->u.ReturnIndex);1543 if(pi->ReturnType==DEF_NON) SetError(3,temporary,cp);1544 }1545 else pi->ReturnType=DEF_DOUBLE;1546 }1547 else pi->ReturnType=DEF_NON;1548 1549 788 return ProcPtrInfoNum-1; 1550 789 } 1551 790 void DeleteProcPtrInfo(void){ 1552 extern P ROCPTRINFO *pProcPtrInfo;791 extern ProcPointer **ppProcPointer; 1553 792 extern int ProcPtrInfoNum; 1554 int i; 1555 1556 for(i=0;i<ProcPtrInfoNum;i++){ 1557 HeapDefaultFree(pProcPtrInfo[i].pParmInfo); 1558 } 1559 1560 HeapDefaultFree(pProcPtrInfo); 1561 } 793 794 for(int i=0;i<ProcPtrInfoNum;i++){ 795 delete ppProcPointer[i]; 796 } 797 798 HeapDefaultFree(ppProcPointer); 799 }
Note:
See TracChangeset
for help on using the changeset viewer.