Holy fucking shit I don't want to work on this. Sibly, you son of a ...
This commit is contained in:
+43
-136
@@ -1,14 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Blitz2DRelease|Win32">
|
||||
<Configuration>Blitz2DRelease</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Blitz3DRelease|Win32">
|
||||
<Configuration>Blitz3DRelease</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
@@ -17,40 +9,21 @@
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Template|Win32">
|
||||
<Configuration>Template</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<SccProjectName />
|
||||
<SccLocalPath />
|
||||
<ProjectGuid>{C23AF61E-9509-411F-933E-17DB18884B21}</ProjectGuid>
|
||||
<WindowsTargetPlatformVersion>10.0.10586.0</WindowsTargetPlatformVersion>
|
||||
<ProjectName>BlitzCc</ProjectName>
|
||||
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Template|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Blitz3DRelease|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Blitz2DRelease|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
<UseOfMfc>false</UseOfMfc>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
@@ -60,61 +33,54 @@
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Template|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="$(VCTargetsPath)Microsoft.Cpp.UpgradeFromVC60.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Blitz3DRelease|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="$(VCTargetsPath)Microsoft.Cpp.UpgradeFromVC60.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Blitz2DRelease|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="$(VCTargetsPath)Microsoft.Cpp.UpgradeFromVC60.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="$(VCTargetsPath)Microsoft.Cpp.UpgradeFromVC60.props" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<OutDir>..\#Build\$(ProjectName)\$(ConfigurationName)\</OutDir>
|
||||
<OutDir>..\#Test\bin\</OutDir>
|
||||
<IntDir>..\#Intermediate\$(ProjectName)\$(ConfigurationName)\</IntDir>
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Blitz2DRelease|Win32'">
|
||||
<OutDir>.\blitz___Win32_Blitz2DRelease\</OutDir>
|
||||
<IntDir>.\blitz___Win32_Blitz2DRelease\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Blitz3DRelease|Win32'">
|
||||
<OutDir>.\blitz___Win32_Blitz3DRelease\</OutDir>
|
||||
<IntDir>.\blitz___Win32_Blitz3DRelease\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(DXSDK_DIR)Include\;$(VC_IncludePath);$(WindowsSDK_IncludePath);</IncludePath>
|
||||
<LibraryPath>$(DXSDK_DIR)Lib\x86\;$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(NETFXKitsDir)Lib\um\x86</LibraryPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<OutDir>.\Release\</OutDir>
|
||||
<IntDir>.\Release\</IntDir>
|
||||
<OutDir>..\#Test\bin\</OutDir>
|
||||
<IntDir>..\#Intermediate\$(ProjectName)\$(ConfigurationName)\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(DXSDK_DIR)Include\;$(VC_IncludePath);$(WindowsSDK_IncludePath);</IncludePath>
|
||||
<LibraryPath>$(DXSDK_DIR)Lib\x86\;$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(NETFXKitsDir)Lib\um\x86</LibraryPath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<InlineFunctionExpansion>Default</InlineFunctionExpansion>
|
||||
<FunctionLevelLinking>false</FunctionLevelLinking>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AssemblerListingLocation>.\Debug\</AssemblerListingLocation>
|
||||
<PrecompiledHeaderOutputFile>.\Debug\blitz.pch</PrecompiledHeaderOutputFile>
|
||||
<ObjectFileName>.\Debug\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>.\Debug\</ProgramDataBaseFileName>
|
||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||
<StringPooling>true</StringPooling>
|
||||
<FloatingPointExceptions>true</FloatingPointExceptions>
|
||||
<CreateHotpatchableImage>true</CreateHotpatchableImage>
|
||||
<CompileAsManaged>false</CompileAsManaged>
|
||||
<CompileAsWinRT>false</CompileAsWinRT>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<ControlFlowGuard>Guard</ControlFlowGuard>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||
<EnforceTypeConversionRules>true</EnforceTypeConversionRules>
|
||||
<RuntimeTypeInfo>true</RuntimeTypeInfo>
|
||||
<OpenMPSupport>false</OpenMPSupport>
|
||||
<CallingConvention>StdCall</CallingConvention>
|
||||
</ClCompile>
|
||||
<Midl>
|
||||
<TypeLibraryName>.\Debug\blitz.tlb</TypeLibraryName>
|
||||
@@ -131,91 +97,33 @@
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<OutputFile>.\Debug\blitz.exe</OutputFile>
|
||||
<AdditionalDependencies>odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Blitz2DRelease|Win32'">
|
||||
<ClCompile>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<InlineFunctionExpansion>Default</InlineFunctionExpansion>
|
||||
<StringPooling>true</StringPooling>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<Optimization>MinSpace</Optimization>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AssemblerListingLocation>.\blitz___Win32_Blitz2DRelease\</AssemblerListingLocation>
|
||||
<PrecompiledHeaderOutputFile>.\blitz___Win32_Blitz2DRelease\blitz.pch</PrecompiledHeaderOutputFile>
|
||||
<ObjectFileName>.\blitz___Win32_Blitz2DRelease\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>.\blitz___Win32_Blitz2DRelease\</ProgramDataBaseFileName>
|
||||
</ClCompile>
|
||||
<Midl>
|
||||
<TypeLibraryName>.\blitz___Win32_Blitz2DRelease\blitz.tlb</TypeLibraryName>
|
||||
</Midl>
|
||||
<ResourceCompile>
|
||||
<Culture>0x1409</Culture>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ResourceCompile>
|
||||
<Bscmake>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<OutputFile>.\blitz___Win32_Blitz2DRelease\blitz.bsc</OutputFile>
|
||||
</Bscmake>
|
||||
<Link>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<OutputFile>..\..\release\blitz2drelease\bin\blitzcc.exe</OutputFile>
|
||||
<AdditionalDependencies>odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Blitz3DRelease|Win32'">
|
||||
<ClCompile>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<InlineFunctionExpansion>Default</InlineFunctionExpansion>
|
||||
<StringPooling>true</StringPooling>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<Optimization>MinSpace</Optimization>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PreprocessorDefinitions>_CONSOLE;WIN32;NDEBUG;PRO;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AssemblerListingLocation>.\blitz___Win32_Blitz3DRelease\</AssemblerListingLocation>
|
||||
<PrecompiledHeaderOutputFile>.\blitz___Win32_Blitz3DRelease\blitz.pch</PrecompiledHeaderOutputFile>
|
||||
<ObjectFileName>.\blitz___Win32_Blitz3DRelease\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>.\blitz___Win32_Blitz3DRelease\</ProgramDataBaseFileName>
|
||||
<CallingConvention>StdCall</CallingConvention>
|
||||
</ClCompile>
|
||||
<Midl>
|
||||
<TypeLibraryName>.\blitz___Win32_Blitz3DRelease\blitz.tlb</TypeLibraryName>
|
||||
</Midl>
|
||||
<ResourceCompile>
|
||||
<Culture>0x1409</Culture>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ResourceCompile>
|
||||
<Bscmake>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<OutputFile>.\blitz___Win32_Blitz3DRelease\blitz.bsc</OutputFile>
|
||||
</Bscmake>
|
||||
<Link>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<OutputFile>../_release/bin/blitzcc.exe</OutputFile>
|
||||
<AdditionalDependencies>odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<InlineFunctionExpansion>Default</InlineFunctionExpansion>
|
||||
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
|
||||
<StringPooling>true</StringPooling>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<Optimization>MinSpace</Optimization>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AssemblerListingLocation>.\Release\</AssemblerListingLocation>
|
||||
<PrecompiledHeaderOutputFile>.\Release\blitz.pch</PrecompiledHeaderOutputFile>
|
||||
<ObjectFileName>.\Release\</ObjectFileName>
|
||||
<ProgramDataBaseFileName>.\Release\</ProgramDataBaseFileName>
|
||||
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<MinimalRebuild>true</MinimalRebuild>
|
||||
<FloatingPointExceptions>true</FloatingPointExceptions>
|
||||
<CreateHotpatchableImage>true</CreateHotpatchableImage>
|
||||
<CompileAsManaged>false</CompileAsManaged>
|
||||
<CompileAsWinRT>false</CompileAsWinRT>
|
||||
<SDLCheck>false</SDLCheck>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<ControlFlowGuard>Guard</ControlFlowGuard>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||
<EnforceTypeConversionRules>false</EnforceTypeConversionRules>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<OpenMPSupport>false</OpenMPSupport>
|
||||
<CallingConvention>StdCall</CallingConvention>
|
||||
</ClCompile>
|
||||
<Midl>
|
||||
<TypeLibraryName>.\Release\blitz.tlb</TypeLibraryName>
|
||||
@@ -231,7 +139,6 @@
|
||||
<Link>
|
||||
<SuppressStartupBanner>true</SuppressStartupBanner>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<OutputFile>..\blitzbasic\bin\blitzcc.exe</OutputFile>
|
||||
<AdditionalDependencies>odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
|
||||
+177
-171
@@ -17,13 +17,13 @@ Environ *runtimeEnviron;
|
||||
vector<string> keyWords;
|
||||
vector<UserFunc> userFuncs;
|
||||
|
||||
static HMODULE linkerHMOD,runtimeHMOD;
|
||||
static HMODULE linkerHMOD, runtimeHMOD;
|
||||
|
||||
static Type *typeof( int c ){
|
||||
switch( c ){
|
||||
case '%':return Type::int_type;
|
||||
case '#':return Type::float_type;
|
||||
case '$':return Type::string_type;
|
||||
static Type *typeof(int c) {
|
||||
switch (c) {
|
||||
case '%':return Type::int_type;
|
||||
case '#':return Type::float_type;
|
||||
case '$':return Type::string_type;
|
||||
}
|
||||
return Type::void_type;
|
||||
}
|
||||
@@ -31,255 +31,261 @@ static Type *typeof( int c ){
|
||||
static int curr;
|
||||
static string text;
|
||||
|
||||
static int next( istream &in ){
|
||||
static int next(istream &in) {
|
||||
|
||||
text="";
|
||||
text = "";
|
||||
|
||||
int t=0;
|
||||
int t = 0;
|
||||
|
||||
for(;;){
|
||||
while( isspace( in.peek() ) ) in.get();
|
||||
if( in.eof() ) return curr=0;
|
||||
t=in.get();if( t!=';' ) break;
|
||||
while( !in.eof() && in.get()!='\n' ){}
|
||||
for (;;) {
|
||||
while (isspace(in.peek())) in.get();
|
||||
if (in.eof()) return curr = 0;
|
||||
t = in.get(); if (t != ';') break;
|
||||
while (!in.eof() && in.get() != '\n') {}
|
||||
}
|
||||
|
||||
if( isalpha(t) ){
|
||||
text+=(char)t;
|
||||
while( isalnum( in.peek() ) || in.peek()=='_' ) text+=(char)in.get();
|
||||
return curr=-1;
|
||||
if (isalpha(t)) {
|
||||
text += (char)t;
|
||||
while (isalnum(in.peek()) || in.peek() == '_') text += (char)in.get();
|
||||
return curr = -1;
|
||||
}
|
||||
if( t=='\"' ){
|
||||
while( in.peek()!='\"' ) text=text+(char)in.get();
|
||||
if (t == '\"') {
|
||||
while (in.peek() != '\"') text = text + (char)in.get();
|
||||
in.get();
|
||||
return curr=-2;
|
||||
return curr = -2;
|
||||
}
|
||||
|
||||
return curr=t;
|
||||
return curr = t;
|
||||
}
|
||||
|
||||
static const char *linkRuntime(){
|
||||
static const char *linkRuntime() {
|
||||
|
||||
while( const char *sym=runtimeLib->nextSym() ){
|
||||
while (const char *sym = runtimeLib->nextSym()) {
|
||||
|
||||
string s( sym );
|
||||
string s(sym);
|
||||
|
||||
int pc=runtimeLib->symValue(sym);
|
||||
int pc = runtimeLib->symValue(sym);
|
||||
|
||||
//internal?
|
||||
if( s[0]=='_' ){
|
||||
runtimeModule->addSymbol( ("_"+s).c_str(),pc );
|
||||
if (s[0] == '_') {
|
||||
runtimeModule->addSymbol(("_" + s).c_str(), pc);
|
||||
continue;
|
||||
}
|
||||
|
||||
bool cfunc=false;
|
||||
bool cfunc = false;
|
||||
|
||||
if( s[0]=='!' ){
|
||||
cfunc=true;
|
||||
s=s.substr(1);
|
||||
if (s[0] == '!') {
|
||||
cfunc = true;
|
||||
s = s.substr(1);
|
||||
}
|
||||
|
||||
keyWords.push_back( s );
|
||||
keyWords.push_back(s);
|
||||
|
||||
//global!
|
||||
int start=0,end;
|
||||
Type *t=Type::void_type;
|
||||
if( !isalpha( s[0] ) ){ start=1;t=typeof( s[0] ); }
|
||||
for( int k=1;k<s.size();++k ){
|
||||
if( !isalnum( s[k] ) && s[k]!='_' ) break;
|
||||
int start = 0, end, k;
|
||||
Type *t = Type::void_type;
|
||||
if (!isalpha(s[0])) { start = 1; t = typeof(s[0]); }
|
||||
for (k = 1; k < s.size(); ++k, end = k) {
|
||||
if (!isalnum(s[k]) && s[k] != '_') break;
|
||||
}
|
||||
end=k;
|
||||
DeclSeq *params=d_new DeclSeq();
|
||||
string n=s.substr( start,end-start );
|
||||
while( k<s.size() ){
|
||||
Type *t=typeof(s[k++]);
|
||||
int from=k;
|
||||
for( ;isalnum(s[k])||s[k]=='_';++k ){}
|
||||
string str=s.substr( from,k-from );
|
||||
ConstType *defType=0;
|
||||
if( s[k]=='=' ){
|
||||
int from=++k;
|
||||
if( s[k]=='\"' ){
|
||||
for( ++k;s[k]!='\"';++k ){}
|
||||
string t=s.substr( from+1,k-from-1 );
|
||||
defType=d_new ConstType( t );++k;
|
||||
}else{
|
||||
if( s[k]=='-' ) ++k;
|
||||
for( ;isdigit( s[k] );++k ){}
|
||||
if( t==Type::int_type ){
|
||||
int n=atoi( s.substr( from,k-from ) );
|
||||
defType=d_new ConstType( n );
|
||||
}else{
|
||||
float n=atof( s.substr( from,k-from ) );
|
||||
defType=d_new ConstType( n );
|
||||
DeclSeq *params = d_new DeclSeq();
|
||||
string n = s.substr(start, end - start);
|
||||
while (k < s.size()) {
|
||||
Type *t = typeof(s[k++]);
|
||||
int from = k;
|
||||
for (; isalnum(s[k]) || s[k] == '_'; ++k) {}
|
||||
string str = s.substr(from, k - from);
|
||||
ConstType *defType = 0;
|
||||
if (s[k] == '=') {
|
||||
int from = ++k;
|
||||
if (s[k] == '\"') {
|
||||
for (++k; s[k] != '\"'; ++k) {}
|
||||
string t = s.substr(from + 1, k - from - 1);
|
||||
defType = d_new ConstType(t); ++k;
|
||||
} else {
|
||||
if (s[k] == '-') ++k;
|
||||
for (; isdigit(s[k]); ++k) {}
|
||||
if (t == Type::int_type) {
|
||||
int n = atoi(s.substr(from, k - from));
|
||||
defType = d_new ConstType(n);
|
||||
} else {
|
||||
float n = atof(s.substr(from, k - from));
|
||||
defType = d_new ConstType(n);
|
||||
}
|
||||
}
|
||||
}
|
||||
Decl *d=params->insertDecl( str,t,DECL_PARAM,defType );
|
||||
Decl *d = params->insertDecl(str, t, DECL_PARAM, defType);
|
||||
}
|
||||
|
||||
FuncType *f=d_new FuncType( t,params,false,cfunc );
|
||||
n=tolower(n);
|
||||
runtimeEnviron->funcDecls->insertDecl( n,f,DECL_FUNC );
|
||||
runtimeModule->addSymbol( ("_f"+n).c_str(),pc );
|
||||
FuncType *f = d_new FuncType(t, params, false, cfunc);
|
||||
n = tolower(n);
|
||||
runtimeEnviron->funcDecls->insertDecl(n, f, DECL_FUNC);
|
||||
runtimeModule->addSymbol(("_f" + n).c_str(), pc);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static set<string> _ulibkws;
|
||||
|
||||
static const char *loadUserLib( const string &userlib ){
|
||||
static const char *loadUserLib(const string &userlib) {
|
||||
|
||||
string t=home+"/userlibs/"+userlib;
|
||||
string t = home + "/userlibs/" + userlib;
|
||||
|
||||
string lib="";
|
||||
string lib = "";
|
||||
ifstream in(t.c_str());
|
||||
|
||||
next(in);
|
||||
while( curr ){
|
||||
while (curr) {
|
||||
|
||||
if( curr=='.' ){
|
||||
if (curr == '.') {
|
||||
|
||||
if( next(in)!=-1 ) return "expecting identifier after '.'";
|
||||
if (next(in) != -1) return "expecting identifier after '.'";
|
||||
|
||||
if( text=="lib" ){
|
||||
if( next(in)!=-2 ) return "expecting string after lib directive";
|
||||
lib=text;
|
||||
if (text == "lib") {
|
||||
if (next(in) != -2) return "expecting string after lib directive";
|
||||
lib = text;
|
||||
|
||||
}else{
|
||||
} else {
|
||||
return "unknown decl directive";
|
||||
}
|
||||
next( in );
|
||||
|
||||
}else if( curr==-1 ){
|
||||
|
||||
if( !lib.size() ) return "function decl without lib directive";
|
||||
|
||||
string id=text;
|
||||
string lower_id=tolower(id);
|
||||
|
||||
if( _ulibkws.count( lower_id ) ) return "duplicate identifier";
|
||||
_ulibkws.insert( lower_id );
|
||||
|
||||
Type *ty=0;
|
||||
switch( next(in) ){
|
||||
case '%':ty=Type::int_type;break;
|
||||
case '#':ty=Type::float_type;break;
|
||||
case '$':ty=Type::string_type;break;
|
||||
}
|
||||
if( ty ) next(in);
|
||||
else ty=Type::void_type;
|
||||
|
||||
DeclSeq *params=d_new DeclSeq();
|
||||
|
||||
if( curr!='(' ) return "expecting '(' after function identifier";
|
||||
next(in);
|
||||
if( curr!=')' ){
|
||||
for(;;){
|
||||
if( curr!=-1 ) break;
|
||||
string arg=text;
|
||||
|
||||
Type *ty=0;
|
||||
switch( next(in) ){
|
||||
case '%':ty=Type::int_type;break;
|
||||
case '#':ty=Type::float_type;break;
|
||||
case '$':ty=Type::string_type;break;
|
||||
case '*':ty=Type::null_type;break;
|
||||
} else if (curr == -1) {
|
||||
|
||||
if (!lib.size()) return "function decl without lib directive";
|
||||
|
||||
string id = text;
|
||||
string lower_id = tolower(id);
|
||||
|
||||
if (_ulibkws.count(lower_id)) return "duplicate identifier";
|
||||
_ulibkws.insert(lower_id);
|
||||
|
||||
Type *ty = 0;
|
||||
switch (next(in)) {
|
||||
case '%':ty = Type::int_type; break;
|
||||
case '#':ty = Type::float_type; break;
|
||||
case '$':ty = Type::string_type; break;
|
||||
}
|
||||
if (ty) next(in);
|
||||
else ty = Type::void_type;
|
||||
|
||||
DeclSeq *params = d_new DeclSeq();
|
||||
|
||||
if (curr != '(') return "expecting '(' after function identifier";
|
||||
next(in);
|
||||
if (curr != ')') {
|
||||
for (;;) {
|
||||
if (curr != -1) break;
|
||||
string arg = text;
|
||||
|
||||
Type *ty = 0;
|
||||
switch (next(in)) {
|
||||
case '%':ty = Type::int_type; break;
|
||||
case '#':ty = Type::float_type; break;
|
||||
case '$':ty = Type::string_type; break;
|
||||
case '*':ty = Type::null_type; break;
|
||||
}
|
||||
if( ty ) next(in);
|
||||
else ty=Type::int_type;
|
||||
if (ty) next(in);
|
||||
else ty = Type::int_type;
|
||||
|
||||
ConstType *defType=0;
|
||||
ConstType *defType = 0;
|
||||
|
||||
Decl *d=params->insertDecl( arg,ty,DECL_PARAM,defType );
|
||||
Decl *d = params->insertDecl(arg, ty, DECL_PARAM, defType);
|
||||
|
||||
if( curr!=',' ) break;
|
||||
if (curr != ',') break;
|
||||
next(in);
|
||||
}
|
||||
}
|
||||
if( curr!=')' ) return "expecting ')' after function decl";
|
||||
if (curr != ')') return "expecting ')' after function decl";
|
||||
|
||||
keyWords.push_back( id );
|
||||
keyWords.push_back(id);
|
||||
|
||||
FuncType *fn=d_new FuncType( ty,params,true,true );
|
||||
FuncType *fn = d_new FuncType(ty, params, true, true);
|
||||
|
||||
runtimeEnviron->funcDecls->insertDecl( lower_id,fn,DECL_FUNC );
|
||||
runtimeEnviron->funcDecls->insertDecl(lower_id, fn, DECL_FUNC);
|
||||
|
||||
if( next(in)==':' ){ //real name?
|
||||
if (next(in) == ':') { //real name?
|
||||
next(in);
|
||||
if( curr!=-1 && curr!=-2 ) return "expecting identifier or string after alias";
|
||||
id=text;
|
||||
if (curr != -1 && curr != -2) return "expecting identifier or string after alias";
|
||||
id = text;
|
||||
next(in);
|
||||
}
|
||||
|
||||
userFuncs.push_back( UserFunc( lower_id,id,lib ) );
|
||||
userFuncs.push_back(UserFunc(lower_id, id, lib));
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const char *linkUserLibs(){
|
||||
static const char *linkUserLibs() {
|
||||
|
||||
_ulibkws.clear();
|
||||
|
||||
WIN32_FIND_DATA fd;
|
||||
|
||||
HANDLE h=FindFirstFile( (home+"/userlibs/*.decls").c_str(),&fd );
|
||||
HANDLE h = FindFirstFile((home + "/userlibs/*.decls").c_str(), &fd);
|
||||
|
||||
if( h==INVALID_HANDLE_VALUE ) return 0;
|
||||
if (h == INVALID_HANDLE_VALUE) return 0;
|
||||
|
||||
const char *err=0;
|
||||
const char *err = 0;
|
||||
|
||||
do{
|
||||
if( err=loadUserLib( fd.cFileName ) ){
|
||||
do {
|
||||
if (err = loadUserLib(fd.cFileName)) {
|
||||
static char buf[64];
|
||||
sprintf( buf,"Error in userlib '%s' - %s",fd.cFileName,err );
|
||||
err=buf;break;
|
||||
sprintf(buf, "Error in userlib '%s' - %s", fd.cFileName, err);
|
||||
err = buf; break;
|
||||
}
|
||||
|
||||
}while( FindNextFile( h,&fd ) );
|
||||
} while (FindNextFile(h, &fd));
|
||||
|
||||
FindClose( h );
|
||||
FindClose(h);
|
||||
|
||||
_ulibkws.clear();
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
const char *openLibs(){
|
||||
|
||||
char *p=getenv( "blitzpath" );
|
||||
if( !p ) return "Can't find blitzpath environment variable";
|
||||
home=string(p);
|
||||
const char *openLibs() {
|
||||
|
||||
linkerHMOD=LoadLibrary( (home+"/bin/linker.dll").c_str() );
|
||||
if( !linkerHMOD ) return "Unable to open linker.dll";
|
||||
/*char *p = getenv("blitzpath");
|
||||
if (!p) return "Can't find blitzpath environment variable";
|
||||
*/
|
||||
char* buf = new char[MAX_PATH];
|
||||
GetModuleFileName(NULL, buf, MAX_PATH);
|
||||
home = string(buf);
|
||||
delete buf;
|
||||
|
||||
string::size_type pos = home.find_last_of("\\/");
|
||||
home = home.substr(0, pos);
|
||||
|
||||
linkerHMOD = LoadLibrary((home + "\\linker.dll").c_str());
|
||||
if (!linkerHMOD) return "Unable to open linker.dll";
|
||||
|
||||
typedef Linker *(_cdecl*GetLinker)();
|
||||
GetLinker gl=(GetLinker)GetProcAddress( linkerHMOD,"linkerGetLinker" );
|
||||
if( !gl ) return "Error in linker.dll";
|
||||
linkerLib=gl();
|
||||
GetLinker gl = (GetLinker)GetProcAddress(linkerHMOD, "linkerGetLinker");
|
||||
if (!gl) return "Error in linker.dll";
|
||||
linkerLib = gl();
|
||||
|
||||
runtimeHMOD=LoadLibrary( (home+"/bin/runtime.dll").c_str() );
|
||||
if( !runtimeHMOD ) return "Unable to open runtime.dll";
|
||||
runtimeHMOD = LoadLibrary((home + "\\runtime.dll").c_str());
|
||||
if (!runtimeHMOD) return "Unable to open runtime.dll";
|
||||
|
||||
typedef Runtime *(_cdecl*GetRuntime)();
|
||||
GetRuntime gr=(GetRuntime)GetProcAddress( runtimeHMOD,"runtimeGetRuntime" );
|
||||
if( !gr ) return "Error in runtime.dll";
|
||||
runtimeLib=gr();
|
||||
GetRuntime gr = (GetRuntime)GetProcAddress(runtimeHMOD, "runtimeGetRuntime");
|
||||
if (!gr) return "Error in runtime.dll";
|
||||
runtimeLib = gr();
|
||||
|
||||
bcc_ver=VERSION;
|
||||
lnk_ver=linkerLib->version();
|
||||
run_ver=runtimeLib->version();
|
||||
bcc_ver = VERSION;
|
||||
lnk_ver = linkerLib->version();
|
||||
run_ver = runtimeLib->version();
|
||||
|
||||
if( (lnk_ver>>16)!=(bcc_ver>>16) ||
|
||||
(run_ver>>16)!=(bcc_ver>>16) ||
|
||||
(lnk_ver>>16)!=(bcc_ver>>16) ) return "Library version error";
|
||||
if ((lnk_ver >> 16) != (bcc_ver >> 16) ||
|
||||
(run_ver >> 16) != (bcc_ver >> 16) ||
|
||||
(lnk_ver >> 16) != (bcc_ver >> 16)) return "Library version error";
|
||||
|
||||
runtimeLib->startup( GetModuleHandle(0) );
|
||||
runtimeLib->startup(GetModuleHandle(0));
|
||||
|
||||
runtimeModule=linkerLib->createModule();
|
||||
runtimeEnviron=d_new Environ( "",Type::int_type,0,0 );
|
||||
runtimeModule = linkerLib->createModule();
|
||||
runtimeEnviron = d_new Environ("", Type::int_type, 0, 0);
|
||||
|
||||
keyWords.clear();
|
||||
userFuncs.clear();
|
||||
@@ -287,26 +293,26 @@ const char *openLibs(){
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char *linkLibs(){
|
||||
const char *linkLibs() {
|
||||
|
||||
if( const char *p=linkRuntime() ) return p;
|
||||
if (const char *p = linkRuntime()) return p;
|
||||
|
||||
if( const char *p=linkUserLibs() ) return p;
|
||||
if (const char *p = linkUserLibs()) return p;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void closeLibs(){
|
||||
void closeLibs() {
|
||||
|
||||
delete runtimeEnviron;
|
||||
if( linkerLib ) linkerLib->deleteModule( runtimeModule );
|
||||
if( runtimeLib ) runtimeLib->shutdown();
|
||||
if( runtimeHMOD ) FreeLibrary( runtimeHMOD );
|
||||
if( linkerHMOD ) FreeLibrary( linkerHMOD );
|
||||
if (linkerLib) linkerLib->deleteModule(runtimeModule);
|
||||
if (runtimeLib) runtimeLib->shutdown();
|
||||
if (runtimeHMOD) FreeLibrary(runtimeHMOD);
|
||||
if (linkerHMOD) FreeLibrary(linkerHMOD);
|
||||
|
||||
runtimeEnviron=0;
|
||||
linkerLib=0;
|
||||
runtimeLib=0;
|
||||
runtimeHMOD=0;
|
||||
linkerHMOD=0;
|
||||
runtimeEnviron = 0;
|
||||
linkerLib = 0;
|
||||
runtimeLib = 0;
|
||||
runtimeHMOD = 0;
|
||||
linkerHMOD = 0;
|
||||
}
|
||||
|
||||
+2
-2
@@ -9,10 +9,10 @@
|
||||
|
||||
using namespace std;
|
||||
|
||||
#include "../linker/linker.h"
|
||||
#include "../LinkerLib/linker.h"
|
||||
#include "../compiler/environ.h"
|
||||
#include "../compiler/parser.h"
|
||||
#include "../bbruntime_dll/bbruntime_dll.h"
|
||||
#include "../Runtime/bbruntime_dll.h"
|
||||
|
||||
extern int bcc_ver;
|
||||
extern int lnk_ver;
|
||||
|
||||
+168
-168
@@ -19,278 +19,278 @@
|
||||
|
||||
using namespace std;
|
||||
|
||||
#include "../linker/linker.h"
|
||||
#include "../LinkerLib/linker.h"
|
||||
#include "../compiler/environ.h"
|
||||
#include "../compiler/parser.h"
|
||||
#include "../compiler/assem_x86/assem_x86.h"
|
||||
#include "../compiler/codegen_x86/codegen_x86.h"
|
||||
#include "../bbruntime_dll/bbruntime_dll.h"
|
||||
#include "../Runtime/bbruntime_dll.h"
|
||||
|
||||
static void showInfo(){
|
||||
const int major=(VERSION&0xffff)/100,minor=(VERSION&0xffff)%100;
|
||||
cout<<"BlitzCC V"<<major<<"."<<minor<<endl;
|
||||
cout<<"(C)opyright 2000-2003 Blitz Research Ltd"<<endl;
|
||||
static void showInfo() {
|
||||
const int major = (VERSION & 0xffff) / 100, minor = (VERSION & 0xffff) % 100;
|
||||
cout << "BlitzCC V" << major << "." << minor << endl;
|
||||
cout << "(C)opyright 2000-2003 Blitz Research Ltd" << endl;
|
||||
}
|
||||
|
||||
static void showUsage(){
|
||||
cout<<"Usage: blitzcc [-h|-q|+q|-c|-d|-k|+k|-v|-o exefile] [sourcefile.bb]"<<endl;
|
||||
static void showUsage() {
|
||||
cout << "Usage: blitzcc [-h|-q|+q|-c|-d|-k|+k|-v|-o exefile] [sourcefile.bb]" << endl;
|
||||
}
|
||||
|
||||
static void showHelp(){
|
||||
static void showHelp() {
|
||||
showUsage();
|
||||
cout<<"-h : show this help"<<endl;
|
||||
cout<<"-q : quiet mode"<<endl;
|
||||
cout<<"+q : very quiet mode"<<endl;
|
||||
cout<<"-c : compile only"<<endl;
|
||||
cout<<"-d : debug compile"<<endl;
|
||||
cout<<"-k : dump keywords"<<endl;
|
||||
cout<<"+k : dump keywords and syntax"<<endl;
|
||||
cout<<"-v : version info"<<endl;
|
||||
cout<<"-o exefile : generate executable"<<endl;
|
||||
cout << "-h : show this help" << endl;
|
||||
cout << "-q : quiet mode" << endl;
|
||||
cout << "+q : very quiet mode" << endl;
|
||||
cout << "-c : compile only" << endl;
|
||||
cout << "-d : debug compile" << endl;
|
||||
cout << "-k : dump keywords" << endl;
|
||||
cout << "+k : dump keywords and syntax" << endl;
|
||||
cout << "-v : version info" << endl;
|
||||
cout << "-o exefile : generate executable" << endl;
|
||||
|
||||
}
|
||||
|
||||
static void err( const string &t ){
|
||||
cout<<t<<endl;
|
||||
static void err(const string &t) {
|
||||
cout << t << endl;
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
static void usageErr(){
|
||||
err( "Usage error" );
|
||||
static void usageErr() {
|
||||
err("Usage error");
|
||||
}
|
||||
|
||||
static string quickHelp( const string &kw ){
|
||||
static string quickHelp(const string &kw) {
|
||||
|
||||
Environ *e=runtimeEnviron;
|
||||
Decl *d=e->funcDecls->findDecl( tolower( kw ) );
|
||||
if( !d || d->type->funcType()==0 ) return "No quick help available for "+kw;
|
||||
string t=kw;
|
||||
FuncType *f=d->type->funcType();
|
||||
if( f->returnType==Type::float_type ) t+='#';
|
||||
else if( f->returnType==Type::string_type ) t+='$';
|
||||
Environ *e = runtimeEnviron;
|
||||
Decl *d = e->funcDecls->findDecl(tolower(kw));
|
||||
if (!d || d->type->funcType() == 0) return "No quick help available for " + kw;
|
||||
string t = kw;
|
||||
FuncType *f = d->type->funcType();
|
||||
if (f->returnType == Type::float_type) t += '#';
|
||||
else if (f->returnType == Type::string_type) t += '$';
|
||||
|
||||
t+=" ";
|
||||
t += " ";
|
||||
|
||||
if( f->returnType!=Type::void_type ) t+="( ";
|
||||
if (f->returnType != Type::void_type) t += "( ";
|
||||
|
||||
for( int k=0;k<f->params->size();++k ){
|
||||
for (int k = 0; k < f->params->size(); ++k) {
|
||||
string s;
|
||||
if( k ) s+=',';
|
||||
Decl *p=f->params->decls[k];s+=p->name;
|
||||
if( p->type==Type::float_type ) s+='#';
|
||||
else if( p->type==Type::string_type ) s+='$';
|
||||
else if( p->type==Type::void_type ) s+='*';
|
||||
if( p->defType ) s='['+s+']';
|
||||
t+=s;
|
||||
if (k) s += ',';
|
||||
Decl *p = f->params->decls[k]; s += p->name;
|
||||
if (p->type == Type::float_type) s += '#';
|
||||
else if (p->type == Type::string_type) s += '$';
|
||||
else if (p->type == Type::void_type) s += '*';
|
||||
if (p->defType) s = '[' + s + ']';
|
||||
t += s;
|
||||
}
|
||||
|
||||
if( f->returnType!=Type::void_type ){
|
||||
t+=f->params->size() ? " )" : ")";
|
||||
if (f->returnType != Type::void_type) {
|
||||
t += f->params->size() ? " )" : ")";
|
||||
}
|
||||
return t;
|
||||
}
|
||||
|
||||
static void dumpKeys( bool lang,bool mod,bool help ){
|
||||
static void dumpKeys(bool lang, bool mod, bool help) {
|
||||
|
||||
if( lang ){
|
||||
map<string,int>::iterator it;
|
||||
map<string,int> &keywords=Toker::getKeywords();
|
||||
for( it=keywords.begin();it!=keywords.end();++it ){
|
||||
if( it->first.find(' ')!=string::npos ) continue;
|
||||
cout<<it->first<<endl;
|
||||
if (lang) {
|
||||
map<string, int>::iterator it;
|
||||
map<string, int> &keywords = Toker::getKeywords();
|
||||
for (it = keywords.begin(); it != keywords.end(); ++it) {
|
||||
if (it->first.find(' ') != string::npos) continue;
|
||||
cout << it->first << endl;
|
||||
}
|
||||
}
|
||||
|
||||
if( !mod ) return;
|
||||
if (!mod) return;
|
||||
|
||||
for( int k=0;k<keyWords.size();++k ){
|
||||
string t=keyWords[k];
|
||||
for (int k = 0; k < keyWords.size(); ++k) {
|
||||
string t = keyWords[k];
|
||||
|
||||
if( t[0]=='_' ) continue;
|
||||
if( !isalpha( t[0] ) ) t=t.substr( 1 );
|
||||
for( int n=0;n<t.size();++n ){
|
||||
if( !isalnum(t[n]) && t[n]!='_' ){
|
||||
t=t.substr( 0,n );
|
||||
if (t[0] == '_') continue;
|
||||
if (!isalpha(t[0])) t = t.substr(1);
|
||||
for (int n = 0; n < t.size(); ++n) {
|
||||
if (!isalnum(t[n]) && t[n] != '_') {
|
||||
t = t.substr(0, n);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if( help ) t=quickHelp(t);
|
||||
cout<<t<<endl;
|
||||
if (help) t = quickHelp(t);
|
||||
cout << t << endl;
|
||||
}
|
||||
}
|
||||
|
||||
static string verstr( int ver ){
|
||||
return itoa((ver&65535)/100)+"."+itoa((ver&65535)%100);
|
||||
static string verstr(int ver) {
|
||||
return itoa((ver & 65535) / 100) + "." + itoa((ver & 65535) % 100);
|
||||
}
|
||||
|
||||
static void versInfo(){
|
||||
cout<<"Compiler version:"<<verstr(bcc_ver)<<endl;
|
||||
cout<<"Runtime version:"<<verstr(run_ver)<<endl;
|
||||
cout<<"Debugger version:"<<verstr(dbg_ver)<<endl;
|
||||
cout<<"Linker version:"<<verstr(lnk_ver)<<endl;
|
||||
static void versInfo() {
|
||||
cout << "Compiler version:" << verstr(bcc_ver) << endl;
|
||||
cout << "Runtime version:" << verstr(run_ver) << endl;
|
||||
cout << "Debugger version:" << verstr(dbg_ver) << endl;
|
||||
cout << "Linker version:" << verstr(lnk_ver) << endl;
|
||||
}
|
||||
|
||||
static void demoError(){
|
||||
cout<<"Compiler can not be used standalone in demo version."<<endl;
|
||||
static void demoError() {
|
||||
cout << "Compiler can not be used standalone in demo version." << endl;
|
||||
exit(0);
|
||||
}
|
||||
|
||||
int _cdecl main( int argc,char *argv[] ){
|
||||
int _cdecl main(int argc, char *argv[]) {
|
||||
|
||||
string in_file,out_file,args;
|
||||
string in_file, out_file, args;
|
||||
|
||||
bool debug=false,quiet=false,veryquiet=false,compileonly=false;
|
||||
bool dumpkeys=false,dumphelp=false,showhelp=false,dumpasm=false;
|
||||
bool versinfo=false;
|
||||
bool debug = false, quiet = false, veryquiet = false, compileonly = false;
|
||||
bool dumpkeys = false, dumphelp = false, showhelp = false, dumpasm = false;
|
||||
bool versinfo = false;
|
||||
|
||||
for( int k=1;k<argc;++k ){
|
||||
for (int k = 1; k < argc; ++k) {
|
||||
|
||||
string t=argv[k];
|
||||
string t = argv[k];
|
||||
|
||||
t=tolower(t);
|
||||
t = tolower(t);
|
||||
|
||||
if( t=="-h" ){
|
||||
showhelp=true;
|
||||
}else if( t=="-a" ){
|
||||
dumpasm=true;
|
||||
}else if( t=="-q" ){
|
||||
quiet=true;
|
||||
}else if( t=="+q" ){
|
||||
quiet=veryquiet=true;
|
||||
}else if( t=="-c" ){
|
||||
compileonly=true;
|
||||
}else if( t=="-d" ){
|
||||
debug=true;
|
||||
}else if( t=="-k" ){
|
||||
dumpkeys=true;
|
||||
}else if( t=="+k" ){
|
||||
dumpkeys=dumphelp=true;
|
||||
}else if( t=="-v" ){
|
||||
versinfo=true;
|
||||
}else if( t=="-o" ){
|
||||
if( out_file.size() || k==argc-1 ) usageErr();
|
||||
out_file=argv[++k];
|
||||
}else{
|
||||
if( in_file.size() || t[0]=='-' || t[0]=='+' ) usageErr();
|
||||
in_file=argv[k];
|
||||
for( ++k;k<argc;++k ){
|
||||
string t=argv[k];
|
||||
if( t.find(' ')!=string::npos ) t='\"'+t+'\"';
|
||||
if( args.size() ) args+=' ';
|
||||
args+=t;
|
||||
if (t == "-h") {
|
||||
showhelp = true;
|
||||
} else if (t == "-a") {
|
||||
dumpasm = true;
|
||||
} else if (t == "-q") {
|
||||
quiet = true;
|
||||
} else if (t == "+q") {
|
||||
quiet = veryquiet = true;
|
||||
} else if (t == "-c") {
|
||||
compileonly = true;
|
||||
} else if (t == "-d") {
|
||||
debug = true;
|
||||
} else if (t == "-k") {
|
||||
dumpkeys = true;
|
||||
} else if (t == "+k") {
|
||||
dumpkeys = dumphelp = true;
|
||||
} else if (t == "-v") {
|
||||
versinfo = true;
|
||||
} else if (t == "-o") {
|
||||
if (out_file.size() || k == argc - 1) usageErr();
|
||||
out_file = argv[++k];
|
||||
} else {
|
||||
if (in_file.size() || t[0] == '-' || t[0] == '+') usageErr();
|
||||
in_file = argv[k];
|
||||
for (++k; k < argc; ++k) {
|
||||
string t = argv[k];
|
||||
if (t.find(' ') != string::npos) t = '\"' + t + '\"';
|
||||
if (args.size()) args += ' ';
|
||||
args += t;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( out_file.size() && !in_file.size() ) usageErr();
|
||||
if (out_file.size() && !in_file.size()) usageErr();
|
||||
|
||||
if( const char *er=openLibs() ) err( er );
|
||||
if (const char *er = openLibs()) err(er);
|
||||
|
||||
if( const char *er=linkLibs() ) err( er );
|
||||
if (const char *er = linkLibs()) err(er);
|
||||
|
||||
if( showhelp ) showHelp();
|
||||
if( dumpkeys ) dumpKeys( true,true,dumphelp );
|
||||
if( versinfo ) versInfo();
|
||||
if (showhelp) showHelp();
|
||||
if (dumpkeys) dumpKeys(true, true, dumphelp);
|
||||
if (versinfo) versInfo();
|
||||
|
||||
if( !in_file.size() ) return 0;
|
||||
if (!in_file.size()) return 0;
|
||||
|
||||
#ifdef DEMO
|
||||
if( !getenv( "blitzide" ) ) demoError();
|
||||
if (!getenv("blitzide")) demoError();
|
||||
#endif
|
||||
|
||||
if( in_file[0]=='\"' ){
|
||||
if( in_file.size()<3 || in_file[in_file.size()-1]!='\"' ) usageErr();
|
||||
in_file=in_file.substr( 1,in_file.size()-2 );
|
||||
if (in_file[0] == '\"') {
|
||||
if (in_file.size() < 3 || in_file[in_file.size() - 1] != '\"') usageErr();
|
||||
in_file = in_file.substr(1, in_file.size() - 2);
|
||||
}
|
||||
|
||||
ifstream in( in_file.c_str() );
|
||||
if( !in ) err( "Unable to open input file" );
|
||||
if( !quiet ){
|
||||
ifstream in(in_file.c_str());
|
||||
if (!in) err("Unable to open input file");
|
||||
if (!quiet) {
|
||||
showInfo();
|
||||
cout<<"Compiling \""<<in_file<<"\""<<endl;
|
||||
cout << "Compiling \"" << in_file << "\"" << endl;
|
||||
}
|
||||
|
||||
int n=in_file.rfind( '/' );
|
||||
if( n==string::npos ) n=in_file.rfind( '\\' );
|
||||
if( n!=string::npos ){
|
||||
if( !n || in_file[n-1]==':' ) ++n;
|
||||
SetCurrentDirectory( in_file.substr(0,n).c_str() );
|
||||
int n = in_file.rfind('/');
|
||||
if (n == string::npos) n = in_file.rfind('\\');
|
||||
if (n != string::npos) {
|
||||
if (!n || in_file[n - 1] == ':') ++n;
|
||||
SetCurrentDirectory(in_file.substr(0, n).c_str());
|
||||
}
|
||||
|
||||
ProgNode *prog=0;
|
||||
Environ *environ=0;
|
||||
Module *module=0;
|
||||
ProgNode *prog = 0;
|
||||
Environ *v_environ = 0;
|
||||
Module *module = 0;
|
||||
|
||||
try{
|
||||
try {
|
||||
//parse
|
||||
if( !veryquiet ) cout<<"Parsing..."<<endl;
|
||||
Toker toker( in );
|
||||
Parser parser( toker );
|
||||
prog=parser.parse( in_file );
|
||||
if (!veryquiet) cout << "Parsing..." << endl;
|
||||
Toker toker(in);
|
||||
Parser parser(toker);
|
||||
prog = parser.parse(in_file);
|
||||
|
||||
//semant
|
||||
if( !veryquiet ) cout<<"Generating..."<<endl;
|
||||
environ=prog->semant( runtimeEnviron );
|
||||
if (!veryquiet) cout << "Generating..." << endl;
|
||||
v_environ = prog->semant(runtimeEnviron);
|
||||
|
||||
//translate
|
||||
if( !veryquiet ) cout<<"Translating..."<<endl;
|
||||
if (!veryquiet) cout << "Translating..." << endl;
|
||||
qstreambuf qbuf;
|
||||
iostream asmcode( &qbuf );
|
||||
Codegen_x86 codegen( asmcode,debug );
|
||||
iostream asmcode(&qbuf);
|
||||
Codegen_x86 codegen(asmcode, debug);
|
||||
|
||||
prog->translate( &codegen,userFuncs );
|
||||
prog->translate(&codegen, userFuncs);
|
||||
|
||||
if( dumpasm ){
|
||||
cout<<endl<<string( qbuf.data(),qbuf.size() )<<endl;
|
||||
if (dumpasm) {
|
||||
cout << endl << string(qbuf.data(), qbuf.size()) << endl;
|
||||
}
|
||||
|
||||
//assemble
|
||||
if( !veryquiet ) cout<<"Assembling..."<<endl;
|
||||
module=linkerLib->createModule();
|
||||
Assem_x86 assem( asmcode,module );
|
||||
if (!veryquiet) cout << "Assembling..." << endl;
|
||||
module = linkerLib->createModule();
|
||||
Assem_x86 assem(asmcode, module);
|
||||
assem.assemble();
|
||||
|
||||
}catch( Ex &x ){
|
||||
} catch (Ex &x) {
|
||||
|
||||
string file='\"'+x.file+'\"';
|
||||
int row=((x.pos>>16)&65535)+1,col=(x.pos&65535)+1;
|
||||
cout<<file<<":"<<row<<":"<<col<<":"<<row<<":"<<col<<":"<<x.ex<<endl;
|
||||
string file = '\"' + x.file + '\"';
|
||||
int row = ((x.pos >> 16) & 65535) + 1, col = (x.pos & 65535) + 1;
|
||||
cout << file << ":" << row << ":" << col << ":" << row << ":" << col << ":" << x.ex << endl;
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
delete prog;
|
||||
|
||||
if( out_file.size() ){
|
||||
if( !veryquiet ) cout<<"Creating executable \""<<out_file<<"\"..."<<endl;
|
||||
if( !module->createExe( out_file.c_str(),(home+"/bin/runtime.dll").c_str() ) ){
|
||||
err( "Error creating executable" );
|
||||
if (out_file.size()) {
|
||||
if (!veryquiet) cout << "Creating executable \"" << out_file << "\"..." << endl;
|
||||
if (!module->createExe(out_file.c_str(), (home + "/bin/runtime.dll").c_str())) {
|
||||
err("Error creating executable");
|
||||
}
|
||||
}else if( !compileonly ){
|
||||
void *entry=module->link( runtimeModule );
|
||||
if( !entry ) return 0;
|
||||
} else if (!compileonly) {
|
||||
void *entry = module->link(runtimeModule);
|
||||
if (!entry) return 0;
|
||||
|
||||
HMODULE dbgHandle=0;
|
||||
Debugger *debugger=0;
|
||||
HMODULE dbgHandle = 0;
|
||||
Debugger *debugger = 0;
|
||||
|
||||
if( debug ){
|
||||
dbgHandle=LoadLibrary( (home+"/bin/debugger.dll").c_str() );
|
||||
if( dbgHandle ){
|
||||
typedef Debugger *(_cdecl*GetDebugger)( Module*,Environ* );
|
||||
GetDebugger gd=(GetDebugger)GetProcAddress( dbgHandle,"debuggerGetDebugger" );
|
||||
if( gd ) debugger=gd( module,environ );
|
||||
if (debug) {
|
||||
dbgHandle = LoadLibrary((home + "/bin/debugger.dll").c_str());
|
||||
if (dbgHandle) {
|
||||
typedef Debugger *(_cdecl*GetDebugger)(Module*, Environ*);
|
||||
GetDebugger gd = (GetDebugger)GetProcAddress(dbgHandle, "debuggerGetDebugger");
|
||||
if (gd) debugger = gd(module, v_environ);
|
||||
}
|
||||
if( !debugger ) err( "Error launching debugger" );
|
||||
if (!debugger) err("Error launching debugger");
|
||||
}
|
||||
|
||||
if( !veryquiet ) cout<<"Executing..."<<endl;
|
||||
if (!veryquiet) cout << "Executing..." << endl;
|
||||
|
||||
runtimeLib->execute( (void(*)())entry,args.c_str(),debugger );
|
||||
runtimeLib->execute((void(*)())entry, args.c_str(), debugger);
|
||||
|
||||
if( dbgHandle ) FreeLibrary( dbgHandle );
|
||||
if (dbgHandle) FreeLibrary(dbgHandle);
|
||||
}
|
||||
|
||||
delete module;
|
||||
delete environ;
|
||||
delete v_environ;
|
||||
|
||||
closeLibs();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user