#include "stdafx.h" #include "common.h" BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember,int *pRefType){ extern int cp; int i,i2,i3; char cPare_Open,cPare_Close; array[0]=0; array2[0]=0; NestMember[0]=0; *pRefType=0; for(i=0;;i++){ if(buffer[i]=='\"'){ for(i++;;i++){ if(IsDBCSLeadByte(buffer[i])){ i++; continue; } if(buffer[i]=='\"') break; } } if(buffer[i]=='['||buffer[i]=='('){ if(buffer[i]=='['){ cPare_Open='['; cPare_Close=']'; } else{ cPare_Open='('; cPare_Close=')'; } buffer[i]=0; for(i++,i2=0;;i++,i2++){ if(buffer[i]==cPare_Open){ if(cPare_Open=='[') i3=GetStringInBracket(array+i2,buffer+i); else i3=GetStringInPare(array+i2,buffer+i); i+=i3-1; i2+=i3-1; continue; } if(buffer[i]==cPare_Close){ array[i2]=0; break; } array[i2]=buffer[i]; } if(buffer[i+1]==cPare_Open){ for(i+=2,i2=0;;i++,i2++){ if(buffer[i]==cPare_Open){ if(cPare_Open=='[') i3=GetStringInBracket(array2+i2,buffer+i); else i3=GetStringInPare(array2+i2,buffer+i); i+=i3-1; i2+=i3-1; continue; } if(buffer[i]==cPare_Close){ array2[i2]=0; break; } array2[i2]=buffer[i]; } if(buffer[i+1]==cPare_Open){ return 0; } } continue; } if(buffer[i]=='.'){ lstrcpy(NestMember,buffer+i+1); *pRefType=DEF_OBJECT; buffer[i]=0; break; } if(buffer[i]=='-'&&buffer[i+1]=='>'){ lstrcpy(NestMember,buffer+i+2); *pRefType=DEF_PTR_OBJECT; buffer[i]=0; break; } if(buffer[i]=='\0') break; } return 1; } int GetTypeFixed(char *TypeName){ if(lstrcmpi(TypeName,"Double")==0) return DEF_DOUBLE; else if(lstrcmpi(TypeName,"Single")==0) return DEF_SINGLE; else if(lstrcmpi(TypeName,"DWORD")==0) return DEF_DWORD; else if(lstrcmpi(TypeName,"Long")==0) return DEF_LONG; else if(lstrcmpi(TypeName,"WORD")==0) return DEF_WORD; else if(lstrcmpi(TypeName,"Integer")==0) return DEF_INTEGER; else if(lstrcmpi(TypeName,"Byte")==0) return DEF_BYTE; else if(lstrcmpi(TypeName,"String")==0) return DEF_STRING; else if(lstrcmpi(TypeName,"Any")==0) return DEF_ANY; else if(lstrcmpi(TypeName,"VoidPtr")==0) return DEF_PTR_VOID; else if(TypeName[0]=='*'){ if(TypeName[1]=='*') return DEF_LONG; else return DEF_PTR_OBJECT; } return DEF_OBJECT; } ////////////////////////////////////////////////////////////// // ここから、クラス、構造体の即席構文解析を行うための関数郡 ////////////////////////////////////////////////////////////// BOOL CheckReferType(char *ClassName,BOOL bArray,char *VarArray,int VarRefType){ int type; type=GetTypeFixed(ClassName); if(!(type==DEF_OBJECT||type==DEF_PTR_OBJECT)) return 0; //文字"*"を取り除く if(type==DEF_PTR_OBJECT) SlideString(ClassName+1,-1); if(type==DEF_OBJECT){ //実体オブジェクトを参照するとき //配列のチェック if(bArray){ if(VarArray[0]=='\0') return 0; } if(VarArray[0]){ if(!bArray) return 0; } if(type!=VarRefType) return 0; } else if(type==DEF_PTR_OBJECT){ //ポインタが示すオブジェクトを参照するとき if(bArray){ if(VarArray[0]=='\0'||VarRefType==DEF_OBJECT) return 0; } else{ if(VarRefType==DEF_OBJECT){ //"."参照 if(VarArray[0]=='\0') return 0; } else{ //"->"参照 if(VarArray[0]) return 0; } } } return 1; } BOOL GetOriginalClassNameFromBuf(char *pBuf,char *ClassName){ int i,i2; char temporary[VN_SIZE]; for(i=0;;i++){ while(pBuf[i]==' '||pBuf[i]=='\t') i++; if(memicmp(pBuf+i,"TypeDef",7)==0&&(pBuf[i+7]==' '||pBuf[i+7]=='\t')){ i+=8; while(pBuf[i]==' '||pBuf[i]=='\t') i++; for(i2=0;;i++,i2++){ if(!IsVariableChar(pBuf[i])){ temporary[i2]=0; break; } temporary[i2]=pBuf[i]; } while(pBuf[i]==' '||pBuf[i]=='\t') i++; if(pBuf[i]=='='){ if(lstrcmp(temporary,ClassName)==0){ //TypeDef宣言の型名が一致したとき i++; while(pBuf[i]==' '||pBuf[i]=='\t') i++; for(i2=0;;i++,i2++){ if(!(IsVariableChar(pBuf[i])||pBuf[i]=='*')){ temporary[i2]=0; break; } temporary[i2]=pBuf[i]; } lstrcpy(ClassName,temporary); return 1; } } } //次の行をサーチ for(;;i++){ i2=IsCommandDelimitation(pBuf,i); if(i2){ if(i2==2) i++; break; } } if(pBuf[i]=='\0') break; } return 0; } void GetOriginalClassName(char *ClassName){ extern char *pHeaderBuf; extern char *pUserSource; BOOL bRet; int i; do{ for(i=0;;i++){ if(ClassName[i]!='*') break; } //ユーザーソースコードからTypeDef宣言をサーチ bRet=GetOriginalClassNameFromBuf(pUserSource,ClassName+i); if(!bRet){ //basic.sbpからTypeDef宣言をサーチ bRet=GetOriginalClassNameFromBuf(pHeaderBuf,ClassName+i); } }while(bRet); } int GetClassPos(char *pBuf,char *ClassName,DWORD *pdwClassType){ //////////////////////////////////////////////////////// // pBuf内からClassNameと一致するクラスの定義位置を取得 //////////////////////////////////////////////////////// int i,i2; char temporary[VN_SIZE]; for(i=0;;i++){ while(pBuf[i]==' '||pBuf[i]=='\t') i++; if(memicmp(pBuf+i,"Class",5)==0&&(pBuf[i+5]==' '||pBuf[i+5]=='\t')|| memicmp(pBuf+i,"Interface",9)==0&&(pBuf[i+9]==' '||pBuf[i+9]=='\t')|| memicmp(pBuf+i,"Type",4)==0&&(pBuf[i+4]==' '||pBuf[i+4]=='\t')){ if(pBuf[i]=='c'||pBuf[i]=='C'){ //Class i+=6; *pdwClassType=ESC_CLASS; } else if(pBuf[i]=='i'||pBuf[i]=='I'){ //Interface i+=10; *pdwClassType=ESC_INTERFACE; } else{ //Type i+=5; *pdwClassType=ESC_TYPE; } while(pBuf[i]==' '||pBuf[i]=='\t') i++; for(i2=0;;i++,i2++){ if(!IsVariableChar(pBuf[i])){ temporary[i2]=0; break; } temporary[i2]=pBuf[i]; } if(lstrcmp(temporary,ClassName)==0){ //クラス名が一致したとき for(;;i++){ if(pBuf[i]=='\0') break; i2=IsCommandDelimitation(pBuf,i); if(i2){ i+=i2; break; } } JumpBlank(pBuf,&i); break; } } //次の行をサーチ for(;;i++){ i2=IsCommandDelimitation(pBuf,i); if(i2){ if(i2==2) i++; break; } } if(pBuf[i]=='\0') break; } return i; } BOOL GetClassNameFromClassMember(char *pBuf,int iPos,char *VarName,char *ClassName,BOOL *pbArray){ ////////////////////////////////////////////////////// // クラス内のメンバ変数のタイプ型であるクラス名の取得 ////////////////////////////////////////////////////// int i,i2; char temporary[8192]; DWORD dwProc; i=iPos; while(1){ temporary[0]=0; if(pBuf[i]=='\0') break; if(memicmp(pBuf+i,"End",3)==0){ /* End Class End Interface End Type の検出 */ i2=i+3; while(pBuf[i2]==' '||pBuf[i2]=='\t') i2++; if(memicmp(pBuf+i2,"Class",5)==0&&(!IsVariableChar(pBuf[i2+5]))|| memicmp(pBuf+i2,"Interface",9)==0&&(!IsVariableChar(pBuf[i2+9]))|| memicmp(pBuf+i2,"Type",4)==0&&(!IsVariableChar(pBuf[i2+4]))) break; } if(memicmp(pBuf+i,"Abstract",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')|| memicmp(pBuf+i,"Virtual",7)==0&&(pBuf[i+7]==' '||pBuf[i+7]=='\t')|| memicmp(pBuf+i,"Override",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')|| memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')|| memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')){ //メンバ関数のとき if(pBuf[i]=='a'||pBuf[i]=='A'){ i+=9; dwProc=ESC_ABSTRACT; } else{ if(pBuf[i]=='v'||pBuf[i]=='V'){ i+=8; while(pBuf[i]==' '||pBuf[i]=='\t') i++; } else if(pBuf[i]=='o'||pBuf[i]=='O'){ i+=9; while(pBuf[i]==' '||pBuf[i]=='\t') i++; } if(pBuf[i]=='f'||pBuf[i]=='F'){ i+=9; dwProc=ESC_FUNCTION; } else if(pBuf[i]=='s'||pBuf[i]=='S'){ i+=4; dwProc=ESC_SUB; } } while(pBuf[i]==' '||pBuf[i]=='\t') i++; } else{ //メンバ変数のとき dwProc=0; } //変数名または関数名を取得 for(i2=0;;i++,i2++){ if(!IsVariableChar(pBuf[i])){ temporary[i2]=0; break; } temporary[i2]=pBuf[i]; } if(dwProc==0){ if(lstrcmp(temporary,VarName)==0) break; } //次の行をサーチ for(;;i++){ if(pBuf[i]=='\0') break; i2=IsCommandDelimitation(pBuf,i); if(i2){ i+=i2; break; } } JumpBlank(pBuf,&i); if(dwProc){ //Abstract定義以外はEnd Sub、End Functionをサーチする if(dwProc==ESC_ABSTRACT) continue; while(1){ if(pBuf[i]=='\0') break; if(memicmp(pBuf+i,"End",3)==0){ /* End Sub End Function の検出 */ i+=3; while(pBuf[i]==' '||pBuf[i]=='\t') i++; if(memicmp(pBuf+i,"Sub",3)==0&&(!IsVariableChar(pBuf[i+3]))|| memicmp(pBuf+i,"Function",8)==0&&(!IsVariableChar(pBuf[i+8]))) break; } //次の行をサーチ for(;;i++){ if(pBuf[i]=='\0') break; i2=IsCommandDelimitation(pBuf,i); if(i2){ i+=i2; break; } } JumpBlank(pBuf,&i); } //次の行をサーチ for(;;i++){ if(pBuf[i]=='\0') break; i2=IsCommandDelimitation(pBuf,i); if(i2){ i+=i2; break; } } JumpBlank(pBuf,&i); } } *pbArray=0; if(temporary[0]){ while(pBuf[i]==' '||pBuf[i]=='\t') i++; if(pBuf[i]=='['){ *pbArray=1; for(i2=1,i++;;i++){ if(pBuf[i]=='\0') break; if(pBuf[i]=='[') i2++; if(pBuf[i]==']'){ i2--; if(i2==0){ i++; break; } } } } if(pBuf[i]=='('){ *pbArray=1; for(i2=1,i++;;i++){ if(pBuf[i]=='\0') break; if(pBuf[i]=='(') i2++; if(pBuf[i]==')'){ i2--; if(i2==0){ i++; break; } } } } //"As 〜" を解析 while(pBuf[i]==' '||pBuf[i]=='\t') i++; if(memicmp(pBuf+i,"As",2)==0&&(pBuf[i+2]==' '||pBuf[i+2]=='\t')){ i+=3; while(pBuf[i]==' '||pBuf[i]=='\t') i++; for(i2=0;;i++,i2++){ if(!(IsVariableChar(pBuf[i])||pBuf[i]=='*')){ ClassName[i2]=0; break; } ClassName[i2]=pBuf[i]; } } else ClassName[0]=0; return 1; } return 0; } void GetCodeAreaType(char *pBuf,int iPos,int *piProcPos,char *NowClass){ /////////////////////////////////////////////// // コード領域(グローバル/ローカル)を判定する // ローカル領域のときはpiProcPosに関数の位置を格納する // クラス定義内のときはNowClassにクラス名を格納する /////////////////////////////////////////////// int i,i2; *piProcPos=-1; for(i=0;;i++){ if(i>=iPos) break; while(pBuf[i]==' '||pBuf[i]=='\t') i++; if(memicmp(pBuf+i,"Class",5)==0&&(pBuf[i+5]==' '||pBuf[i+5]=='\t')|| memicmp(pBuf+i,"Interface",9)==0&&(pBuf[i+9]==' '||pBuf[i+9]=='\t')|| memicmp(pBuf+i,"Type",4)==0&&(pBuf[i+4]==' '||pBuf[i+4]=='\t')){ //Class、Interface、Type if(pBuf[i]=='c'||pBuf[i]=='C') i+=6; else if(pBuf[i]=='i'||pBuf[i]=='I') i+=10; else i+=5; while(pBuf[i]==' '||pBuf[i]=='\t') i++; for(i2=0;;i++,i2++){ if(!IsVariableChar(pBuf[i])){ NowClass[i2]=0; break; } NowClass[i2]=pBuf[i]; } } else if(memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')|| memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')){ //Sub、Function *piProcPos=i; } else if(memicmp(pBuf+i,"End",3)==0){ i+=3; while(pBuf[i]==' '||pBuf[i]=='\t') i++; if(memicmp(pBuf+i,"Sub",3)==0&&(!IsVariableChar(pBuf[i+3]))|| memicmp(pBuf+i,"Function",8)==0&&(!IsVariableChar(pBuf[i+8]))){ //End Sub、End Function *piProcPos=-1; } else if(memicmp(pBuf+i,"Class",5)==0&&(!IsVariableChar(pBuf[i+5]))|| memicmp(pBuf+i,"Interface",9)==0&&(!IsVariableChar(pBuf[i+9]))|| memicmp(pBuf+i,"Type",4)==0&&(!IsVariableChar(pBuf[i+4]))){ //End Class、End Interface、End Type NowClass[0]=0; } } //次の行をサーチ for(;;i++){ i2=IsCommandDelimitation(pBuf,i); if(i2){ if(i2==2) i++; break; } } if(pBuf[i]=='\0') break; } } BOOL GetClassNameFromDim(char *pBuf,int *piPos,char *VarName,char *ClassName,BOOL *pbArray){ int i,i2; char temporary[8192]; i=*piPos; while(1){ while(pBuf[i]==' '||pBuf[i]=='\t') i++; if((memicmp(pBuf+i,"ByRef",5)==0||memicmp(pBuf+i,"ByVal",5)==0)&& (pBuf[i+5]==' '||pBuf[i+5]=='\t')){ //ByRef/ByVal表記を飛び越す i+=6; while(pBuf[i]==' '||pBuf[i]=='\t') i++; } for(i2=0;;i++,i2++){ if(!IsVariableChar(pBuf[i])){ temporary[i2]=0; break; } temporary[i2]=pBuf[i]; } if(lstrcmp(temporary,VarName)==0) break; for(;;i++){ if(IsCommandDelimitation(pBuf,i)) break; if(pBuf[i]==','){ i++; break; } } if(IsCommandDelimitation(pBuf,i)){ temporary[0]=0; break; } } *pbArray=0; if(temporary[0]){ while(pBuf[i]==' '||pBuf[i]=='\t') i++; if(pBuf[i]=='['){ *pbArray=1; for(i2=1,i++;;i++){ if(pBuf[i]=='\0') break; if(pBuf[i]=='[') i2++; if(pBuf[i]==']'){ i2--; if(i2==0){ i++; break; } } } } //"As 〜" を解析 while(pBuf[i]==' '||pBuf[i]=='\t') i++; if(memicmp(pBuf+i,"As",2)==0&&(pBuf[i+2]==' '||pBuf[i+2]=='\t')){ i+=3; while(pBuf[i]==' '||pBuf[i]=='\t') i++; for(i2=0;;i++,i2++){ if(!(IsVariableChar(pBuf[i])||pBuf[i]=='*')){ ClassName[i2]=0; break; } ClassName[i2]=pBuf[i]; } } else ClassName[0]=0; *piPos=i; return 1; } *piPos=i; return 0; } BOOL GetVariableClassName(char *pEditBuf,int iPos,char *VarName,char *ClassName,BOOL *pbArray){ ////////////////////////////////////////// // 変数宣言コードをもとに、クラス名を取得 ////////////////////////////////////////// extern char *pHeaderBuf; extern char *pUserSource; int i,i2; char NowClass[VN_SIZE]; // キャレット位置のコード領域を判定(クラス/ローカル/グローバル) int iProcPos; GetCodeAreaType(pEditBuf,iPos,&iProcPos,NowClass); ////////////////////////////////////////// // 変数宣言コードをもとに、クラス名を取得 ////////////////////////////////////////// if(iProcPos!=-1){ //ローカル領域 i=iProcPos; //関数パラメータをサーチ for(;;i++){ if(pEditBuf[i]=='('){ i++; if(GetClassNameFromDim(pEditBuf,&i,VarName,ClassName,pbArray)) return 1; } i2=IsCommandDelimitation(pEditBuf,i); if(i2){ if(pEditBuf[i]=='\0') break; i+=i2; break; } } //関数内ソースコードをサーチ for(;;i++){ while(pEditBuf[i]==' '||pEditBuf[i]=='\t') i++; if(memicmp(pEditBuf+i,"End",3)==0){ i+=3; while(pEditBuf[i]==' '||pEditBuf[i]=='\t') i++; if(memicmp(pEditBuf+i,"Sub",3)==0&&(!IsVariableChar(pEditBuf[i+3]))|| memicmp(pEditBuf+i,"Function",8)==0&&(!IsVariableChar(pEditBuf[i+3]))){ break; } } else if(memicmp(pEditBuf+i,"Dim",3)==0&&(pEditBuf[i+3]==' '||pEditBuf[i+3]=='\t')){ i+=3; if(GetClassNameFromDim(pEditBuf,&i,VarName,ClassName,pbArray)) return 1; } for(;;i++){ i2=IsCommandDelimitation(pEditBuf,i); if(i2){ if(i2==2) i++; break; } } if(pEditBuf[i]=='\0') break; } } if(NowClass[0]&&iProcPos!=-1){ //クラスメンバ関数領域 DWORD dwClassType; char *pBuf; i=GetClassPos(pUserSource,NowClass,&dwClassType); if(pUserSource[i]=='\0'){ i=GetClassPos(pHeaderBuf,NowClass,&dwClassType); if(pHeaderBuf[i]=='\0') pBuf=0; else pBuf=pHeaderBuf; } else pBuf=pUserSource; if(pBuf){ i=GetClassNameFromClassMember(pBuf,i,VarName,ClassName,pbArray); if(i) return 1; } } //グローバル領域 for(i=0;;i++){ while(pUserSource[i]==' '||pUserSource[i]=='\t') i++; if(memicmp(pUserSource+i,"Dim",3)==0&&(pUserSource[i+3]==' '||pUserSource[i+3]=='\t')){ i+=3; if(GetClassNameFromDim(pUserSource,&i,VarName,ClassName,pbArray)) return 1; } else if(memicmp(pUserSource+i,"Sub",3)==0&&(pUserSource[i+3]==' '||pUserSource[i+3]=='\t')|| memicmp(pUserSource+i,"Function",8)==0&&(pUserSource[i+8]==' '||pUserSource[i+8]=='\t')){ //Sub 〜 End Sub、Function 〜 End Function間を飛び越す while(1){ //次の行をサーチ for(;;i++){ if(pUserSource[i]=='\0') break; i2=IsCommandDelimitation(pUserSource,i); if(i2){ i+=i2; break; } } JumpBlank(pUserSource,&i); if(pUserSource[i]=='\0') break; if(memicmp(pUserSource+i,"End",3)==0){ /* End Sub End Function の検出 */ i+=3; while(pUserSource[i]==' '||pUserSource[i]=='\t') i++; if(memicmp(pUserSource+i,"Sub",3)==0&&(!IsVariableChar(pUserSource[i+3]))|| memicmp(pUserSource+i,"Function",8)==0&&(!IsVariableChar(pUserSource[i+8]))) break; } } } //次の行をサーチ for(;;i++){ i2=IsCommandDelimitation(pUserSource,i); if(i2){ if(i2==2) i++; break; } } if(pUserSource[i]=='\0') break; } return 0; }