Initial commit.

This commit is contained in:
blitz-research
2014-01-31 08:23:00 +13:00
commit 08a613ed0e
322 changed files with 45306 additions and 0 deletions
+206
View File
@@ -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
View File
@@ -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;
}
+39
View File
@@ -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
View File
@@ -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;
}