Initial commit.
This commit is contained in:
+206
@@ -0,0 +1,206 @@
|
||||
# Microsoft Developer Studio Project File - Name="blitz" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Console Application" 0x0103
|
||||
|
||||
CFG=blitz - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "blitz.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "blitz.mak" CFG="blitz - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "blitz - Win32 Release" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE "blitz - Win32 Debug" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE "blitz - Win32 Blitz3DRelease" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE "blitz - Win32 Blitz2DRelease" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE "blitz - Win32 Blitz3DEdu" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE "blitz - Win32 Blitz3DDemo" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "blitz - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release"
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /MT /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD BASE RSC /l 0x1409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x1409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"..\blitzbasic\bin\blitzcc.exe"
|
||||
|
||||
!ELSEIF "$(CFG)" == "blitz - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD BASE RSC /l 0x1409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x1409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
|
||||
!ELSEIF "$(CFG)" == "blitz - Win32 Blitz3DRelease"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "blitz___Win32_Blitz3DRelease"
|
||||
# PROP BASE Intermediate_Dir "blitz___Win32_Blitz3DRelease"
|
||||
# PROP BASE Ignore_Export_Lib 0
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "blitz___Win32_Blitz3DRelease"
|
||||
# PROP Intermediate_Dir "blitz___Win32_Blitz3DRelease"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MT /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /G6 /Gz /MT /W3 /GX /O1 /D "_CONSOLE" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "PRO" /FD /c
|
||||
# SUBTRACT CPP /YX
|
||||
# ADD BASE RSC /l 0x1409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x1409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"..\blitzbasic\bin\blitzcc.exe"
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"..\..\release\blitz3drelease\bin\blitzcc.exe"
|
||||
|
||||
!ELSEIF "$(CFG)" == "blitz - Win32 Blitz2DRelease"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "blitz___Win32_Blitz2DRelease"
|
||||
# PROP BASE Intermediate_Dir "blitz___Win32_Blitz2DRelease"
|
||||
# PROP BASE Ignore_Export_Lib 0
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "blitz___Win32_Blitz2DRelease"
|
||||
# PROP Intermediate_Dir "blitz___Win32_Blitz2DRelease"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MT /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /MT /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD BASE RSC /l 0x1409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x1409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"..\..\release\blitz3drelease\bin\blitzcc.exe"
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"..\..\release\blitz2drelease\bin\blitzcc.exe"
|
||||
|
||||
!ELSEIF "$(CFG)" == "blitz - Win32 Blitz3DEdu"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "blitz___Win32_Blitz3DEdu"
|
||||
# PROP BASE Intermediate_Dir "blitz___Win32_Blitz3DEdu"
|
||||
# PROP BASE Ignore_Export_Lib 0
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "blitz___Win32_Blitz3DEdu"
|
||||
# PROP Intermediate_Dir "blitz___Win32_Blitz3DEdu"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /G6 /Gz /MT /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "PRO" /YX /FD /c
|
||||
# ADD CPP /nologo /G6 /Gz /MT /W3 /GX /O1 /D "_CONSOLE" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "PRO" /D "EDU" /YX /FD /c
|
||||
# ADD BASE RSC /l 0x1409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x1409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"..\..\release\blitz3drelease\bin\blitzcc.exe"
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"..\..\release\blitz3dedu\bin\blitzcc.exe"
|
||||
|
||||
!ELSEIF "$(CFG)" == "blitz - Win32 Blitz3DDemo"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "blitz___Win32_Blitz3DDemo"
|
||||
# PROP BASE Intermediate_Dir "blitz___Win32_Blitz3DDemo"
|
||||
# PROP BASE Ignore_Export_Lib 0
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "blitz___Win32_Blitz3DDemo"
|
||||
# PROP Intermediate_Dir "blitz___Win32_Blitz3DDemo"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /G6 /Gz /MT /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "PRO" /YX /FD /c
|
||||
# ADD CPP /nologo /G6 /Gz /MT /W3 /GX /O1 /D "_CONSOLE" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "PRO" /D "DEMO" /YX /FD /c
|
||||
# ADD BASE RSC /l 0x1409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x1409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"..\..\release\blitz3drelease\bin\blitzcc.exe"
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"..\..\release\blitz3ddemo\bin\blitzcc.exe"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "blitz - Win32 Release"
|
||||
# Name "blitz - Win32 Debug"
|
||||
# Name "blitz - Win32 Blitz3DRelease"
|
||||
# Name "blitz - Win32 Blitz2DRelease"
|
||||
# Name "blitz - Win32 Blitz3DEdu"
|
||||
# Name "blitz - Win32 Blitz3DDemo"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\libs.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\libs.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\main.cpp
|
||||
# End Source File
|
||||
# End Target
|
||||
# End Project
|
||||
+312
@@ -0,0 +1,312 @@
|
||||
|
||||
#include "libs.h"
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
int bcc_ver;
|
||||
int lnk_ver;
|
||||
int run_ver;
|
||||
int dbg_ver;
|
||||
|
||||
string home;
|
||||
Linker *linkerLib;
|
||||
Runtime *runtimeLib;
|
||||
|
||||
Module *runtimeModule;
|
||||
Environ *runtimeEnviron;
|
||||
vector<string> keyWords;
|
||||
vector<UserFunc> userFuncs;
|
||||
|
||||
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;
|
||||
}
|
||||
return Type::void_type;
|
||||
}
|
||||
|
||||
static int curr;
|
||||
static string text;
|
||||
|
||||
static int next( istream &in ){
|
||||
|
||||
text="";
|
||||
|
||||
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' ){}
|
||||
}
|
||||
|
||||
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();
|
||||
in.get();
|
||||
return curr=-2;
|
||||
}
|
||||
|
||||
return curr=t;
|
||||
}
|
||||
|
||||
static const char *linkRuntime(){
|
||||
|
||||
while( const char *sym=runtimeLib->nextSym() ){
|
||||
|
||||
string s( sym );
|
||||
|
||||
int pc=runtimeLib->symValue(sym);
|
||||
|
||||
//internal?
|
||||
if( s[0]=='_' ){
|
||||
runtimeModule->addSymbol( ("_"+s).c_str(),pc );
|
||||
continue;
|
||||
}
|
||||
|
||||
bool cfunc=false;
|
||||
|
||||
if( s[0]=='!' ){
|
||||
cfunc=true;
|
||||
s=s.substr(1);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
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 );
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static set<string> _ulibkws;
|
||||
|
||||
static const char *loadUserLib( const string &userlib ){
|
||||
|
||||
string t=home+"/userlibs/"+userlib;
|
||||
|
||||
string lib="";
|
||||
ifstream in(t.c_str());
|
||||
|
||||
next(in);
|
||||
while( curr ){
|
||||
|
||||
if( curr=='.' ){
|
||||
|
||||
if( next(in)!=-1 ) return "expecting identifier after '.'";
|
||||
|
||||
if( text=="lib" ){
|
||||
if( next(in)!=-2 ) return "expecting string after lib directive";
|
||||
lib=text;
|
||||
|
||||
}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;
|
||||
}
|
||||
if( ty ) next(in);
|
||||
else ty=Type::int_type;
|
||||
|
||||
ConstType *defType=0;
|
||||
|
||||
Decl *d=params->insertDecl( arg,ty,DECL_PARAM,defType );
|
||||
|
||||
if( curr!=',' ) break;
|
||||
next(in);
|
||||
}
|
||||
}
|
||||
if( curr!=')' ) return "expecting ')' after function decl";
|
||||
|
||||
keyWords.push_back( id );
|
||||
|
||||
FuncType *fn=d_new FuncType( ty,params,true,true );
|
||||
|
||||
runtimeEnviron->funcDecls->insertDecl( lower_id,fn,DECL_FUNC );
|
||||
|
||||
if( next(in)==':' ){ //real name?
|
||||
next(in);
|
||||
if( curr!=-1 && curr!=-2 ) return "expecting identifier or string after alias";
|
||||
id=text;
|
||||
next(in);
|
||||
}
|
||||
|
||||
userFuncs.push_back( UserFunc( lower_id,id,lib ) );
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const char *linkUserLibs(){
|
||||
|
||||
_ulibkws.clear();
|
||||
|
||||
WIN32_FIND_DATA fd;
|
||||
|
||||
HANDLE h=FindFirstFile( (home+"/userlibs/*.decls").c_str(),&fd );
|
||||
|
||||
if( h==INVALID_HANDLE_VALUE ) return 0;
|
||||
|
||||
const char *err=0;
|
||||
|
||||
do{
|
||||
if( err=loadUserLib( fd.cFileName ) ){
|
||||
static char buf[64];
|
||||
sprintf( buf,"Error in userlib '%s' - %s",fd.cFileName,err );
|
||||
err=buf;break;
|
||||
}
|
||||
|
||||
}while( FindNextFile( h,&fd ) );
|
||||
|
||||
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);
|
||||
|
||||
linkerHMOD=LoadLibrary( (home+"/bin/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();
|
||||
|
||||
runtimeHMOD=LoadLibrary( (home+"/bin/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();
|
||||
|
||||
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";
|
||||
|
||||
runtimeLib->startup( GetModuleHandle(0) );
|
||||
|
||||
runtimeModule=linkerLib->createModule();
|
||||
runtimeEnviron=d_new Environ( "",Type::int_type,0,0 );
|
||||
|
||||
keyWords.clear();
|
||||
userFuncs.clear();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char *linkLibs(){
|
||||
|
||||
if( const char *p=linkRuntime() ) return p;
|
||||
|
||||
if( const char *p=linkUserLibs() ) return p;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void closeLibs(){
|
||||
|
||||
delete runtimeEnviron;
|
||||
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;
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
|
||||
#ifndef LIBS_H
|
||||
#define LIBS_H
|
||||
|
||||
#include <map>
|
||||
#include <list>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
using namespace std;
|
||||
|
||||
#include "../linker/linker.h"
|
||||
#include "../compiler/environ.h"
|
||||
#include "../compiler/parser.h"
|
||||
#include "../bbruntime_dll/bbruntime_dll.h"
|
||||
|
||||
extern int bcc_ver;
|
||||
extern int lnk_ver;
|
||||
extern int run_ver;
|
||||
extern int dbg_ver;
|
||||
|
||||
//openLibs
|
||||
extern string home;
|
||||
extern Linker *linkerLib;
|
||||
extern Runtime *runtimeLib;
|
||||
|
||||
//linkLibs
|
||||
extern Module *runtimeModule;
|
||||
extern Environ *runtimeEnviron;
|
||||
extern vector<string> keyWords;
|
||||
extern vector<UserFunc> userFuncs;
|
||||
|
||||
const char *openLibs();
|
||||
|
||||
const char *linkLibs();
|
||||
|
||||
void closeLibs();
|
||||
|
||||
#endif
|
||||
+298
@@ -0,0 +1,298 @@
|
||||
|
||||
#pragma warning(disable:4786)
|
||||
|
||||
#include "libs.h"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include "../config/config.h"
|
||||
#include "../stdutil/stdutil.h"
|
||||
|
||||
#include <set>
|
||||
#include <map>
|
||||
#include <list>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
|
||||
using namespace std;
|
||||
|
||||
#include "../linker/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"
|
||||
|
||||
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 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;
|
||||
|
||||
}
|
||||
|
||||
static void err( const string &t ){
|
||||
cout<<t<<endl;
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
static void usageErr(){
|
||||
err( "Usage error" );
|
||||
}
|
||||
|
||||
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+='$';
|
||||
|
||||
t+=" ";
|
||||
|
||||
if( f->returnType!=Type::void_type ) t+="( ";
|
||||
|
||||
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( f->returnType!=Type::void_type ){
|
||||
t+=f->params->size() ? " )" : ")";
|
||||
}
|
||||
return t;
|
||||
}
|
||||
|
||||
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( !mod ) return;
|
||||
|
||||
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 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
if( help ) t=quickHelp(t);
|
||||
cout<<t<<endl;
|
||||
}
|
||||
}
|
||||
|
||||
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 demoError(){
|
||||
cout<<"Compiler can not be used standalone in demo version."<<endl;
|
||||
exit(0);
|
||||
}
|
||||
|
||||
int _cdecl main( int argc,char *argv[] ){
|
||||
|
||||
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;
|
||||
|
||||
for( int k=1;k<argc;++k ){
|
||||
|
||||
string t=argv[k];
|
||||
|
||||
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( out_file.size() && !in_file.size() ) usageErr();
|
||||
|
||||
if( const char *er=openLibs() ) err( er );
|
||||
|
||||
if( const char *er=linkLibs() ) err( er );
|
||||
|
||||
if( showhelp ) showHelp();
|
||||
if( dumpkeys ) dumpKeys( true,true,dumphelp );
|
||||
if( versinfo ) versInfo();
|
||||
|
||||
if( !in_file.size() ) return 0;
|
||||
|
||||
#ifdef DEMO
|
||||
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 );
|
||||
}
|
||||
|
||||
ifstream in( in_file.c_str() );
|
||||
if( !in ) err( "Unable to open input file" );
|
||||
if( !quiet ){
|
||||
showInfo();
|
||||
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() );
|
||||
}
|
||||
|
||||
ProgNode *prog=0;
|
||||
Environ *environ=0;
|
||||
Module *module=0;
|
||||
|
||||
try{
|
||||
//parse
|
||||
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 );
|
||||
|
||||
//translate
|
||||
if( !veryquiet ) cout<<"Translating..."<<endl;
|
||||
qstreambuf qbuf;
|
||||
iostream asmcode( &qbuf );
|
||||
Codegen_x86 codegen( asmcode,debug );
|
||||
|
||||
prog->translate( &codegen,userFuncs );
|
||||
|
||||
if( dumpasm ){
|
||||
cout<<endl<<string( qbuf.data(),qbuf.size() )<<endl;
|
||||
}
|
||||
|
||||
//assemble
|
||||
if( !veryquiet ) cout<<"Assembling..."<<endl;
|
||||
module=linkerLib->createModule();
|
||||
Assem_x86 assem( asmcode,module );
|
||||
assem.assemble();
|
||||
|
||||
}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;
|
||||
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" );
|
||||
}
|
||||
}else if( !compileonly ){
|
||||
void *entry=module->link( runtimeModule );
|
||||
if( !entry ) return 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( !debugger ) err( "Error launching debugger" );
|
||||
}
|
||||
|
||||
if( !veryquiet ) cout<<"Executing..."<<endl;
|
||||
|
||||
runtimeLib->execute( (void(*)())entry,args.c_str(),debugger );
|
||||
|
||||
if( dbgHandle ) FreeLibrary( dbgHandle );
|
||||
}
|
||||
|
||||
delete module;
|
||||
delete environ;
|
||||
|
||||
closeLibs();
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user