www.pudn.com > HEC-linux.zip > main.cpp
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + + main.cpp - this is the boot-strap file + + + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ANSI includes + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include#include #include /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + virtual machine includes + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #ifdef WINDOWS_32 #include #endif #ifdef LINUX_x86 #include #endif #include #include /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + prototypes + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /*void main(int argc, char *argv[]);*/ void shutDown(U1 code); /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + assembler components + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + macros + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /*#define MAIN_DEBUG 1*/ #ifdef MAIN_DEBUG #define MAIN_DEBUG0(arg); printf("main(): ");printf(arg); #define MAIN_DEBUG1(arg1,arg2); printf("main(): ");printf(arg1,arg2); #define MAIN_DEBUG2(arg1,arg2,arg3); printf("main(): ");printf(arg1,arg2,arg3); #else #define MAIN_DEBUG0(arg); #define MAIN_DEBUG1(arg1,arg2); #define MAIN_DEBUG2(arg1,arg2,arg3); #endif /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + function definitions + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ void main(int argc, char *argv[]) { CommandLine cmdLine(&maxErrors); nErrors = 0; /*1) handle command line arguments */ MAIN_DEBUG0("handling arguments\n"); if((cmdLine.handleArgs(argc,argv))==FALSE) { FATAL_ERROR(); } /*2) PASS1 - scan, parse, populate symbol table*/ MAIN_DEBUG0("initiating first pass\n"); StringTable strTbl; HashTable hashTbl(&strTbl); SymbolTable symTbl(&strTbl); struct Line line; { Pass1 pass1(&strTbl,&symTbl,&hashTbl); LineScanner scanner(&cmdLine); line = scanner.getInputLine(); while(line.end!=TRUE) { pass1.parseLine(&line); line = scanner.getInputLine(); } pass1.parseLine(&line); } /* strTbl.printStrTbl(); symTbl.printSymTbl(); hashTbl.printHashTbl(); */ /*if errors exist, shutdown before generate anything*/ if(nErrors > 0) { printf("%d Error(s) during first pass\n",nErrors); printf("build failed\n"); FATAL_ERROR(); } /*3) PASS2 - create bytecode temp file and listing file */ MAIN_DEBUG0("initiating second pass\n"); { Pass2 pass2(&cmdLine,&strTbl,&symTbl,&hashTbl); LineScanner scanner(&cmdLine); line = scanner.getInputLine(); while(line.end!=TRUE) { pass2.parseLine(&line); line = scanner.getInputLine(); } pass2.parseLine(&line); if(cmdLine.listing==TRUE){ pass2.generateSymbolSummary(); } } MAIN_DEBUG1("%lu bytes written to tempfile\n",pass2.bytePosPass2); /*if errors exist after 2rd pass, shutdown */ if(nErrors > 0) { printf("main(): %d Error(s) during second pass\n",nErrors); printf("main(): build failed\n"); FATAL_ERROR(); } /*4) build compilation unit */ MAIN_DEBUG0("building bytecode executable\n"); { BuildFile bldfile(&cmdLine,&strTbl, &symTbl); bldfile.buildFileFormat(); } /*5) safe-shutdown */ printf("main(): exiting with (%d) errors\n",nErrors); shutDown(SHUTDOWN_OK); return; }/*end main*/ /* ----------------------------------------------------------------*/ void shutDown(U1 code) { exit(code); }/*end shutDown*/