#include "common.h" CEnumParent **ppobj_EnumParent; int iEnumParentNum; CEnumMember::CEnumMember(char *name,int value){ m_name=(char *)HeapAlloc(hHeap,0,lstrlen(name)+1); lstrcpy(m_name,name); m_value=value; } CEnumMember::~CEnumMember(){ if(m_name) HeapDefaultFree(m_name); } CEnumParent::CEnumParent(char *buffer,int NowLine){ ppobj_EnumMember=(CEnumMember **)HeapAlloc(hHeap,0,1); iEnumMemberNum=0; int i=0,i2; if(!(buffer[i]==1&&buffer[i+1]==ESC_ENUM)) return; i+=2; //列挙体の名前を取得 char temporary[VN_SIZE]; for(i2=0;;i++,i2++){ if(IsCommandDelimitation(buffer[i])){ temporary[i2]=0; break; } if(!IsVariableChar(buffer[i])){ SetError(1,NULL,i); break; } temporary[i2]=buffer[i]; } TypeName=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1); lstrcpy(TypeName,temporary); if(buffer[i]=='\0'){ SetError(22,"Enum",NowLine); return; } int NextValue=0; while(1){ i++; if(buffer[i]==1&&buffer[i+1]==ESC_ENDENUM) break; for(i2=0;;i2++,i++){ if(IsCommandDelimitation(buffer[i])){ temporary[i2]=0; break; } if(buffer[i]=='='){ temporary[i2]=0; break; } temporary[i2]=buffer[i]; } if(temporary[0]=='\0'){ if(buffer[i]=='\0'){ SetError(22,"Enum",NowLine); break; } continue; } if(buffer[i]!='='){ NextValue++; } else{ char temp2[VN_SIZE]; for(i++,i2=0;;i2++,i++){ if(IsCommandDelimitation(buffer[i])){ temp2[i2]=0; break; } temp2[i2]=buffer[i]; } NextValue=atoi(temp2); } //メンバを追加 ppobj_EnumMember=(CEnumMember **)HeapReAlloc(hHeap,0,ppobj_EnumMember,(iEnumMemberNum+1)*sizeof(CEnumMember *)); ppobj_EnumMember[iEnumMemberNum]=new CEnumMember(temporary,NextValue); iEnumMemberNum++; } } CEnumParent::~CEnumParent(){ HeapDefaultFree(TypeName); int i; for(i=0;i=2){ if(basbuf[i-2]==1&&basbuf[i-1]==ESC_CONST) continue; } ppobj_EnumParent=(CEnumParent **)HeapReAlloc(hHeap,0,ppobj_EnumParent,(iEnumParentNum+1)*sizeof(CEnumParent *)); ppobj_EnumParent[iEnumParentNum]=new CEnumParent(basbuf+i,i); iEnumParentNum++; } } } void CEnumParent::DestroyEnum(void){ int i; for(i=0;iTypeName); length+=lstrlen(buffer+length); lstrcpy(buffer+length,"\tInherits EnumBase\n"); length+=lstrlen(buffer+length); lstrcpy(buffer+length,"Public\n"); length+=lstrlen(buffer+length); sprintf(buffer+length,"\tSub %s()\n",parent->TypeName); length+=lstrlen(buffer+length); if(parent->iEnumMemberNum){ sprintf(buffer+length,"\t\tEnumBase(%d)\n", parent->ppobj_EnumMember[0]->m_value); length+=lstrlen(buffer+length); } lstrcpy(buffer+length,"\tEnd Sub\n"); length+=lstrlen(buffer+length); sprintf(buffer+length,"\tSub %s(value As Long)\n",parent->TypeName); length+=lstrlen(buffer+length); lstrcpy(buffer+length,"\t\tEnumBase(value)\n"); length+=lstrlen(buffer+length); lstrcpy(buffer+length,"\tEnd Sub\n"); length+=lstrlen(buffer+length); sprintf(buffer+length,"\tSub ~%s()\n",parent->TypeName); length+=lstrlen(buffer+length); lstrcpy(buffer+length,"\tEnd Sub\n"); length+=lstrlen(buffer+length); for(i2=0;i2iEnumMemberNum;i2++){ CEnumMember *member; member=parent->ppobj_EnumMember[i2]; sprintf(buffer+length,"\tStatic %s As %s(%d)\n", member->m_name, parent->TypeName, member->m_value); length+=lstrlen(buffer+length); } sprintf(buffer+length,"\tOverride Function ToString() As String\n",parent->TypeName); length+=lstrlen(buffer+length); lstrcpy(buffer+length,"\t\tSelect Case m_Value\n"); length+=lstrlen(buffer+length); for(i2=0;i2iEnumMemberNum;i2++){ CEnumMember *member; member=parent->ppobj_EnumMember[i2]; sprintf(buffer+length,"\t\t\tCase %d\n",member->m_value); length+=lstrlen(buffer+length); sprintf(buffer+length,"\t\t\t\tReturn \"%s\"\n",member->m_name); length+=lstrlen(buffer+length); } lstrcpy(buffer+length,"\t\tEnd Select\n"); length+=lstrlen(buffer+length); lstrcpy(buffer+length,"\tEnd Function\n"); length+=lstrlen(buffer+length); sprintf(buffer+length,"\tSub Operator= (ByRef value As %s)\n",parent->TypeName); length+=lstrlen(buffer+length); lstrcpy(buffer+length,"\t\tThis.Copy(ByVal VarPtr(value))\n"); length+=lstrlen(buffer+length); lstrcpy(buffer+length,"\tEnd Sub\n"); length+=lstrlen(buffer+length); /*sprintf(buffer+length,"\tSub Operator= (ByRef value As String)\n",parent->TypeName); length+=lstrlen(buffer+length); lstrcpy(buffer+length,"\t\tSelect Case value\n"); length+=lstrlen(buffer+length); for(i2=0;i2iEnumMemberNum;i2++){ CEnumMember *member; member=parent->ppobj_EnumMember[i2]; sprintf(buffer+length,"\t\t\tCase \"%s\"\n",member->m_name); length+=lstrlen(buffer+length); sprintf(buffer+length,"\t\t\t\tThis=%s.%s\n",parent->TypeName,member->m_name); length+=lstrlen(buffer+length); } lstrcpy(buffer+length,"\t\tEnd Select\n"); length+=lstrlen(buffer+length); lstrcpy(buffer+length,"\tEnd Sub\n"); length+=lstrlen(buffer+length);*/ sprintf(buffer+length,"\tSub Operator= (value As Long)\n",parent->TypeName); length+=lstrlen(buffer+length); lstrcpy(buffer+length,"\t\tm_Value=value\n"); length+=lstrlen(buffer+length); lstrcpy(buffer+length,"\tEnd Sub\n"); length+=lstrlen(buffer+length); lstrcpy(buffer+length,"End Class\n"); length+=lstrlen(buffer+length); //バッファ領域が足りなくなった場合はバッファを増量する if(length>MaxSize){ MaxSize+=65535; buffer=(char *)HeapReAlloc(hHeap,0,buffer,MaxSize+65535); } } return buffer; }