diff --git a/harbour/ChangeLog b/harbour/ChangeLog index a70c03de1d..c7b83ad2a8 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,17 @@ +Mon May 10 19:32:34 1999 Gonzalo A. Diethelm + + * makefile.b32: + Added source/compiler/harbour.c to this makefile. + + * source/compiler/Makefile: + Added genobj32.c. + + * source/compiler/genobj32.c: + Got rid of warnings. + + * source/compiler/harbour.y: + Added '/' as path separator. + 19990510-11:30 Eddie Runia * source/rtl/classes.c Function IsMessage() added diff --git a/harbour/makefile.b32 b/harbour/makefile.b32 index ae9d23d1b8..f4053be89f 100644 --- a/harbour/makefile.b32 +++ b/harbour/makefile.b32 @@ -68,12 +68,13 @@ tclass.c : tclass.prg harbour.exe bcc32 -c -O2 -I.\include -o$@ $< tlib .\libs\b32\harbour.lib -+$@,, -harbour.exe : y_tab.c lexyy.c genobj32.c compiler.h +harbour.exe : y_tab.c lexyy.c genobj32.obj harbour.obj compiler.h bcc32 -O2 -ebin\harbour.exe -Iinclude;source\compiler \ - source\compiler\y_tab.c source\compiler\lexyy.c source\compiler\genobj32.c + source\compiler\y_tab.c source\compiler\lexyy.c \ + source\compiler\genobj32.obj \ + source\compiler\harbour.obj \ del y_tab.obj del lexyy.obj - del compiler.obj y_tab.c : harbour.y bison -d -v -y -osource\compiler\y_tab.c source\compiler\harbour.y @@ -81,6 +82,10 @@ y_tab.c : harbour.y lexyy.c : harbour.l flex -i -8 -osource\compiler\lexyy.c source\compiler\harbour.l +genobj32.obj : genobj32.c + bcc32 -c -O2 -I.\include -osource\compiler\genobj32.obj \ + source\compiler\genobj32.c + harbour.obj : harbour.c bcc32 -c -O2 -I.\include -osource\compiler\harbour.obj \ source\compiler\harbour.c diff --git a/harbour/source/compiler/Makefile b/harbour/source/compiler/Makefile index 2c355f3c0b..cde30d12f2 100644 --- a/harbour/source/compiler/Makefile +++ b/harbour/source/compiler/Makefile @@ -8,6 +8,9 @@ YACC_SOURCE=harbour.y LEX_SOURCE=harbour.l +C_SOURCES=\ + genobj32.c \ + C_MAIN=harbour.c include $(TOP)$(ROOT)config/bin.cf diff --git a/harbour/source/compiler/genobj32.c b/harbour/source/compiler/genobj32.c index dce74ef06d..60fdeb07cf 100644 --- a/harbour/source/compiler/genobj32.c +++ b/harbour/source/compiler/genobj32.c @@ -32,212 +32,213 @@ extern SYMBOLS symbols; extern int _iQuiet, _iStartProc; static BYTE prgFunction[] = { 0x68, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, - 0x00, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xC4, 0x08, 0xC3 }; + 0x00, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x83, 0xC4, 0x08, 0xC3 }; static char * * externNames = 0; WORD wExternals = 1; /* _VirtualMachine is always added */ void GenObj32( char * szObjFileName, char * szFileName ) { - FILE * hObjFile; /* file handle for OBJ output */ + FILE * hObjFile; /* file handle for OBJ output */ - if( ! ( hObjFile = fopen( szObjFileName, "wb" ) ) ) - { - printf( "Error opening file %s\n", szObjFileName ); - return; - } + if( ! ( hObjFile = fopen( szObjFileName, "wb" ) ) ) + { + printf( "Error opening file %s\n", szObjFileName ); + return; + } - if( ! _iQuiet ) - printf( "\ngenerating Windows/Dos OBJ 32 bits..." ); + if( ! _iQuiet ) + printf( "\ngenerating Windows/Dos OBJ 32 bits..." ); - CompiledFileName( hObjFile, szFileName ); - CompilerVersion( hObjFile, "Harbour" ); - GenerateLocalNames( hObjFile ); - GenerateExternals( hObjFile ); - GenerateCodeSegment( hObjFile ); - GenerateDataSegment( hObjFile ); - GenerateSymbolsSegment( hObjFile ); - End( hObjFile ); + CompiledFileName( hObjFile, szFileName ); + CompilerVersion( hObjFile, "Harbour" ); + GenerateLocalNames( hObjFile ); + GenerateExternals( hObjFile ); + GenerateCodeSegment( hObjFile ); + GenerateDataSegment( hObjFile ); + GenerateSymbolsSegment( hObjFile ); + End( hObjFile ); - fclose( hObjFile ); + fclose( hObjFile ); - if( ! _iQuiet ) - printf( "\n%s -> done!\n", szObjFileName ); + if( ! _iQuiet ) + printf( "\n%s -> done!\n", szObjFileName ); } static ULONG GetSymbolsSize( void ) { - return ( symbols.iCount - ( _iStartProc ? 0: 1 ) ) * sizeof( SYMBOL ); + return ( symbols.iCount - ( _iStartProc ? 0: 1 ) ) * sizeof( SYMBOL ); } static PCOMSYMBOL GetFirstSymbol( void ) { - PCOMSYMBOL pSymbol = symbols.pFirst; + PCOMSYMBOL pSymbol = symbols.pFirst; - if( ! _iStartProc ) - pSymbol = pSymbol->pNext; + if( ! _iStartProc ) + pSymbol = pSymbol->pNext; - return pSymbol; + return pSymbol; } static char * GetSymbolName( ULONG ulPos ) { - PCOMSYMBOL pSymbol = GetFirstSymbol(); - ULONG ul = 0; + PCOMSYMBOL pSymbol = GetFirstSymbol(); + ULONG ul = 0; - while( pSymbol && ( ul++ < ulPos ) ) - pSymbol = pSymbol->pNext; + while( pSymbol && ( ul++ < ulPos ) ) + pSymbol = pSymbol->pNext; - return pSymbol->szName; + return pSymbol->szName; } static ULONG GetPCodesSize( void ) { - ULONG ulTotal = 0; - PFUNCTION pFunction = functions.pFirst; + ULONG ulTotal = 0; + PFUNCTION pFunction = functions.pFirst; - if( ! _iStartProc ) - pFunction = pFunction->pNext; + if( ! _iStartProc ) + pFunction = pFunction->pNext; - while( pFunction ) - { + while( pFunction ) + { ulTotal += pFunction->lPCodePos + 1; /* _ENDPROC !!! */ pFunction = pFunction->pNext; - } - return ulTotal; + } + return ulTotal; } ULONG GetSymbolsAmount( void ) { - PCOMSYMBOL pSymbol = GetFirstSymbol(); - ULONG ulAmount = 1; + PCOMSYMBOL pSymbol = GetFirstSymbol(); + ULONG ulAmount = 1; - while( pSymbol->pNext ) - { + while( pSymbol->pNext ) + { ulAmount++; pSymbol = pSymbol->pNext; - } - return ulAmount; + } + return ulAmount; } BOOL IsExternal( ULONG ulSymbol ) { - PCOMSYMBOL pSymbol = GetFirstSymbol(); - ULONG ul = 0; + PCOMSYMBOL pSymbol = GetFirstSymbol(); + ULONG ul = 0; - while( ul++ < ulSymbol ) - pSymbol = pSymbol->pNext; + while( ul++ < ulSymbol ) + pSymbol = pSymbol->pNext; - return ! GetFunction( pSymbol->szName ); + return ! GetFunction( pSymbol->szName ); } WORD GetExternalPos( char * szExternal ) { - WORD w = 0; + WORD w = 0; - while( w < wExternals ) - { + while( w < wExternals ) + { if( ! strcmp( szExternal, externNames[ w ] ) ) - break; + break; w++; - } + } - return w; + return w; } static void GenerateLocalNames( FILE * hObjFile ) { - char * localNames[] = { "_TEXT", "CODE", "_DATA", "DATA", - "HB_SYMBOLS", "HB_STARTSYMBOLS", "HB_ENDSYMBOLS", "SYMGROUP", 0 }; + char * localNames[] = { "_TEXT", "CODE", "_DATA", "DATA", + "HB_SYMBOLS", "HB_STARTSYMBOLS", "HB_ENDSYMBOLS", "SYMGROUP", 0 }; - LocalNames( hObjFile, localNames ); + LocalNames( hObjFile, localNames ); } static void GenerateSymbolsSegment( FILE * hObjFile ) { - BYTE symbolsData[] = { 0, 0, 0, 0, 0, 0 }; - BYTE groupSegments[] = { 3, 4, 5, 0 }; /* segments order for HB_... */ + BYTE symbolsData[] = { 0, 0, 0, 0, 0, 0 }; + BYTE groupSegments[] = { 3, 4, 5, 0 }; /* segments order for HB_... */ - DefineSegment( hObjFile, 7, 5, 0 ); /* 7 = HB_STARTSYMBOLS, 5 = DATA */ - DefineSegment( hObjFile, 6, /* "HB_SYMBOLS" position + 1 into localNames */ - 5, /* "DATA" position + 1 into localNames */ - 6 ); /* segment length */ - DefineSegment( hObjFile, 8, 5, 0 ); /* 8 = HB_ENDSYMBOLS, 5 = DATA */ + DefineSegment( hObjFile, 7, 5, 0 ); /* 7 = HB_STARTSYMBOLS, 5 = DATA */ + DefineSegment( hObjFile, 6, /* "HB_SYMBOLS" position + 1 into localNames */ + 5, /* "DATA" position + 1 into localNames */ + 6 ); /* segment length */ + DefineSegment( hObjFile, 8, 5, 0 ); /* 8 = HB_ENDSYMBOLS, 5 = DATA */ - GroupDef( hObjFile, 8, groupSegments ); /* 8 = "SYMGROUP" localNames position */ + GroupDef( hObjFile, 8, groupSegments ); /* 8 = "SYMGROUP" localNames position */ - * ( WORD * ) symbolsData = GetSymbolsAmount(); + * ( WORD * ) symbolsData = GetSymbolsAmount(); - EnumeratedData( hObjFile, 4, symbolsData, sizeof( symbolsData ), 0 ); /* 4 = HB_SYMBOLS defined segment */ + EnumeratedData( hObjFile, 4, symbolsData, sizeof( symbolsData ), 0 ); /* 4 = HB_SYMBOLS defined segment */ - Fixup( hObjFile, 0xE4, 2, 0x54, 2 ); /* Data: symbols location */ + Fixup( hObjFile, 0xE4, 2, 0x54, 2 ); /* Data: symbols location */ } static void GenerateDataSegment( FILE * hObjFile ) { - SYMBOL symbol; - ULONG ulSize = GetSymbolsSize(); - PCOMSYMBOL pSymbol = GetFirstSymbol(); - ULONG ulSymbols = GetSymbolsAmount(), ul; + SYMBOL symbol; + ULONG ulSize = GetSymbolsSize(); + PCOMSYMBOL pSymbol = GetFirstSymbol(); + ULONG ulSymbols = GetSymbolsAmount(), ul; - while( pSymbol ) - { + while( pSymbol ) + { ulSize += strlen( pSymbol->szName ) + 1; pSymbol = pSymbol->pNext; - } + } - ulSize += GetPCodesSize(); + ulSize += GetPCodesSize(); - DefineSegment( hObjFile, 4, /* "_DATA" position + 1 into localNames */ - 5, /* "DATA" position + 1 into localNames */ - ulSize ); /* segment length */ + DefineSegment( hObjFile, 4, /* "_DATA" position + 1 into localNames */ + 5, /* "DATA" position + 1 into localNames */ + ulSize ); /* segment length */ - memset( &symbol, 0, sizeof( symbol ) ); - DataSegment( hObjFile, &symbol, sizeof( symbol ), GetSymbolsAmount(), ulSize ); + memset( &symbol, 0, sizeof( symbol ) ); + DataSegment( hObjFile, (BYTE *) &symbol, + sizeof( symbol ), GetSymbolsAmount(), ulSize ); - pSymbol = GetFirstSymbol(); - for( ul = 0; ul < ulSymbols; ul++ ) - { + pSymbol = GetFirstSymbol(); + for( ul = 0; ul < ulSymbols; ul++ ) + { Fixup( hObjFile, 0xE4, ( ul * sizeof( SYMBOL ) ), 0x54, 2 ); /* Data symbol name location */ if( IsExternal( ul ) ) - { - if( ! ( pSymbol->cScope & FS_MESSAGE ) ) + { + if( ! ( pSymbol->cScope & FS_MESSAGE ) ) Fixup( hObjFile, 0xE4, ( ul * sizeof( SYMBOL ) ) + 5, 0x56, - GetExternalPos( GetSymbolName( ul ) ) + 1 ); - } + GetExternalPos( GetSymbolName( ul ) ) + 1 ); + } else - { - /* if( ! ( pSymbol->cScope & FS_MESSAGE ) ) */ - Fixup( hObjFile, 0xE4, ( ul * sizeof( SYMBOL ) ) + 5, 0x54, 1 ); /* function address location */ - } + { + /* if( ! ( pSymbol->cScope & FS_MESSAGE ) ) */ + Fixup( hObjFile, 0xE4, ( ul * sizeof( SYMBOL ) ) + 5, 0x54, 1 ); /* function address location */ + } pSymbol = pSymbol->pNext; - } + } } static void GenerateCodeSegment( FILE * hObjFile ) { - WORD wFunctions = functions.iCount - ( _iStartProc ? 0: 1 ); - ULONG ulSize = wFunctions * sizeof( prgFunction ); - PFUNCTION pFunc = ( _iStartProc ? functions.pFirst: functions.pFirst->pNext ); - WORD w = 0; + WORD wFunctions = functions.iCount - ( _iStartProc ? 0: 1 ); + ULONG ulSize = wFunctions * sizeof( prgFunction ); + PFUNCTION pFunc = ( _iStartProc ? functions.pFirst: functions.pFirst->pNext ); + WORD w = 0; - DefineSegment( hObjFile, 2, /* "_TEXT" position + 1 into localNames */ - 3, /* "CODE" position + 1 into localNames */ - ulSize ); /* segment length */ + DefineSegment( hObjFile, 2, /* "_TEXT" position + 1 into localNames */ + 3, /* "CODE" position + 1 into localNames */ + ulSize ); /* segment length */ - while( pFunc ) - { + while( pFunc ) + { if( !( pFunc->cScope & ( FS_STATIC | FS_INIT | FS_EXIT ) ) ) - PubDef( hObjFile, pFunc->szName, 1, w * sizeof( prgFunction ) ); + PubDef( hObjFile, pFunc->szName, 1, w * sizeof( prgFunction ) ); w++; pFunc = pFunc->pNext; - } + } - CodeSegment( hObjFile, prgFunction, sizeof( prgFunction ), wFunctions ); + CodeSegment( hObjFile, prgFunction, sizeof( prgFunction ), wFunctions ); - for( w = 0; w < wFunctions; w++ ) - { + for( w = 0; w < wFunctions; w++ ) + { /* prgFunction fixups */ Fixup( hObjFile, 0xE4, ( w * sizeof( prgFunction ) ) + 1, 0x54, 2 ); /* Data: symbols location */ @@ -247,446 +248,443 @@ static void GenerateCodeSegment( FILE * hObjFile ) Fixup( hObjFile, 0xA4, ( w * sizeof( prgFunction ) ) + 11, 0x56, 1 ); /* External: _VirtualMachine */ - } + } } static void GenerateExternals( FILE * hObjFile ) { - WORD w; - PFUNCTION pFunc, pFTemp; + WORD w; + PFUNCTION pFunc, pFTemp; - /* calculate amount of externals */ - pFunc = funcalls.pFirst; - while( pFunc ) - { + /* calculate amount of externals */ + pFunc = funcalls.pFirst; + while( pFunc ) + { if( ! ( pFTemp = GetFunction( pFunc->szName ) ) || pFTemp == functions.pFirst ) - wExternals++; + wExternals++; pFunc = pFunc->pNext; - } - if( wExternals ) - { + } + if( wExternals ) + { externNames = ( char * * ) OurMalloc( sizeof( char * ) * ( wExternals + 2 ) ); w = 1; externNames[ 0 ] = "_VirtualMachine"; pFunc = funcalls.pFirst; while( pFunc ) - { - if( ! ( pFTemp = GetFunction( pFunc->szName ) ) || pFTemp == functions.pFirst ) + { + if( ! ( pFTemp = GetFunction( pFunc->szName ) ) || pFTemp == functions.pFirst ) externNames[ w++ ] = pFunc->szName; - pFunc = pFunc->pNext; - } + pFunc = pFunc->pNext; + } externNames[ w ] = 0; ExternalNames( hObjFile, externNames ); - } + } } static void putbyte( BYTE b, FILE * hObjFile ) { - fputc( b, hObjFile ); + fputc( b, hObjFile ); } void putword( WORD w, FILE * hObjFile ) { - putbyte( LOBYTE( w ), hObjFile ); - putbyte( HIBYTE( w ), hObjFile ); + putbyte( LOBYTE( w ), hObjFile ); + putbyte( HIBYTE( w ), hObjFile ); } static void CompiledFileName( FILE * hObjFile, char * szFileName ) { - WORD wLen = strlen( szFileName ); - BYTE bChk = 0; /* this is a checksum the linker will check to asure OBJ integrity */ - BYTE bChar; + WORD wLen = strlen( szFileName ); + BYTE bChk = 0; /* this is a checksum the linker will check to asure OBJ integrity */ + BYTE bChar; - putbyte( 0x80, hObjFile ); /* this tells the linker the kind of OBJ record this is */ - bChk += 0x80; + putbyte( 0x80, hObjFile ); /* this tells the linker the kind of OBJ record this is */ + bChk += 0x80; - putbyte( 1 + 1 + wLen, hObjFile ); /* now it comes the total length of this OBJ record */ - bChk += ( 1 + 1 + wLen ); - putbyte( 0, hObjFile ); + putbyte( 1 + 1 + wLen, hObjFile ); /* now it comes the total length of this OBJ record */ + bChk += ( 1 + 1 + wLen ); + putbyte( 0, hObjFile ); - putbyte( wLen, hObjFile ); /* szFileName length */ - bChk += wLen; + putbyte( wLen, hObjFile ); /* szFileName length */ + bChk += wLen; - while( bChar = * szFileName++ ) - { + while( (bChar = * szFileName++) ) + { putbyte( bChar, hObjFile ); /* each of the szFileName characters */ bChk += bChar; - } + } - putbyte( 256 - bChk, hObjFile ); /* a checksum that will be recalculated by the linker */ + putbyte( 256 - bChk, hObjFile ); /* a checksum that will be recalculated by the linker */ } static void CompilerVersion( FILE * hObjFile, char * szVersion ) { - WORD wLen = strlen( szVersion ); - BYTE bChk = 0; /* this is a checksum the linker will check to asure OBJ integrity */ - BYTE bChar; + WORD wLen = strlen( szVersion ); + BYTE bChk = 0; /* this is a checksum the linker will check to asure OBJ integrity */ + BYTE bChar; - putbyte( 0x88, hObjFile ); /* this tells the linker the kind of OBJ record this is */ - bChk += 0x88; + putbyte( 0x88, hObjFile ); /* this tells the linker the kind of OBJ record this is */ + bChk += 0x88; - putword( 3 + wLen, hObjFile ); /* now it comes the total length of this OBJ record */ - bChk += LOBYTE( 3 + wLen ); - bChk += HIBYTE( 3 + wLen ); + putword( 3 + wLen, hObjFile ); /* now it comes the total length of this OBJ record */ + bChk += LOBYTE( 3 + wLen ); + bChk += HIBYTE( 3 + wLen ); - putword( 0, hObjFile ); + putword( 0, hObjFile ); - while( bChar = * szVersion++ ) - { + while( (bChar = * szVersion++) ) + { putbyte( bChar, hObjFile ); /* each of the szFileName characters */ bChk += bChar; - } + } - putbyte( 256 - bChk, hObjFile ); /* a checksum that will be recalculated by the linker */ + putbyte( 256 - bChk, hObjFile ); /* a checksum that will be recalculated by the linker */ } static void LocalNames( FILE * hObjFile, char * szNames[] ) { - BYTE b = 0, c; - WORD wTotalLen = 0; - BYTE bChk = 0; - BYTE bChar; + BYTE b = 0, c; + WORD wTotalLen = 0; + BYTE bChk = 0; - while( szNames[ b ] ) - wTotalLen += strlen( szNames[ b++ ] ); - wTotalLen += 2 + b; + while( szNames[ b ] ) + wTotalLen += strlen( szNames[ b++ ] ); + wTotalLen += 2 + b; - putbyte( 0x96, hObjFile ); - bChk += 0x96; + putbyte( 0x96, hObjFile ); + bChk += 0x96; - putbyte( LOBYTE( wTotalLen ), hObjFile ); - bChk += LOBYTE( wTotalLen ); - putbyte( HIBYTE( wTotalLen ), hObjFile ); - bChk += HIBYTE( wTotalLen ); + putbyte( LOBYTE( wTotalLen ), hObjFile ); + bChk += LOBYTE( wTotalLen ); + putbyte( HIBYTE( wTotalLen ), hObjFile ); + bChk += HIBYTE( wTotalLen ); - putbyte( 0, hObjFile ); + putbyte( 0, hObjFile ); - b = 0; - while( szNames[ b ] ) - { + b = 0; + while( szNames[ b ] ) + { putbyte( strlen( szNames[ b ] ), hObjFile ); bChk += strlen( szNames[ b ] ); c = 0; while( szNames[ b ][ c ] ) - { - putbyte( szNames[ b ][ c ], hObjFile ); - bChk += szNames[ b ][ c++ ]; - } + { + putbyte( szNames[ b ][ c ], hObjFile ); + bChk += szNames[ b ][ c++ ]; + } b++; - } - putbyte( 256 - bChk, hObjFile ); + } + putbyte( 256 - bChk, hObjFile ); } static void ExternalNames( FILE * hObjFile, char * szNames[] ) { - BYTE b = 0, c; - WORD wTotalLen = 0; - BYTE bChk = 0; - BYTE bChar; + BYTE b = 0, c; + WORD wTotalLen = 0; + BYTE bChk = 0; - while( szNames[ b ] ) - wTotalLen += strlen( szNames[ b++ ] ) + 1; - wTotalLen += 2 + b - 1; + while( szNames[ b ] ) + wTotalLen += strlen( szNames[ b++ ] ) + 1; + wTotalLen += 2 + b - 1; - putbyte( 0x8C, hObjFile ); - bChk += 0x8C; + putbyte( 0x8C, hObjFile ); + bChk += 0x8C; - putword( wTotalLen, hObjFile ); - bChk += LOBYTE( wTotalLen ); - bChk += HIBYTE( wTotalLen ); + putword( wTotalLen, hObjFile ); + bChk += LOBYTE( wTotalLen ); + bChk += HIBYTE( wTotalLen ); - b = 0; - while( szNames[ b ] ) - { + b = 0; + while( szNames[ b ] ) + { putbyte( strlen( szNames[ b ] ), hObjFile ); bChk += strlen( szNames[ b ] ); c = 0; while( szNames[ b ][ c ] ) - { - putbyte( szNames[ b ][ c ], hObjFile ); - bChk += szNames[ b ][ c++ ]; - } + { + putbyte( szNames[ b ][ c ], hObjFile ); + bChk += szNames[ b ][ c++ ]; + } putbyte( 0, hObjFile ); b++; - } - putbyte( 256 - bChk, hObjFile ); + } + putbyte( 256 - bChk, hObjFile ); } static void CodeSegment( FILE * hObjFile, BYTE * prgCode, ULONG ulPrgLen, WORD wFunctions ) { - BYTE bCheckSum = 0; - WORD y; - WORD wTotalLen = ( ulPrgLen * wFunctions ) + 4; - ULONG ul; - PFUNCTION pFunction = functions.pFirst; - ULONG ulPCodeOffset = ( symbols.iCount - ( _iStartProc ? 0: 1 ) ) * sizeof( SYMBOL ); + BYTE bCheckSum = 0; + WORD y; + WORD wTotalLen = ( ulPrgLen * wFunctions ) + 4; + ULONG ul; + PFUNCTION pFunction = functions.pFirst; + ULONG ulPCodeOffset = ( symbols.iCount - ( _iStartProc ? 0: 1 ) ) * sizeof( SYMBOL ); - if( ! _iStartProc ) - pFunction = pFunction->pNext; + if( ! _iStartProc ) + pFunction = pFunction->pNext; - putbyte( 0xA0, hObjFile ); - bCheckSum += 0xA0; + putbyte( 0xA0, hObjFile ); + bCheckSum += 0xA0; - putword( wTotalLen, hObjFile ); - bCheckSum += LOBYTE( wTotalLen ); - bCheckSum += HIBYTE( wTotalLen ); + putword( wTotalLen, hObjFile ); + bCheckSum += LOBYTE( wTotalLen ); + bCheckSum += HIBYTE( wTotalLen ); - putbyte( 1, hObjFile ); /* 1 = _TEXT segment */ - bCheckSum += 1; + putbyte( 1, hObjFile ); /* 1 = _TEXT segment */ + bCheckSum += 1; - putword( 0, hObjFile ); /* 0 = offset */ + putword( 0, hObjFile ); /* 0 = offset */ - for( y = 0; y < wFunctions; y++ ) - { + for( y = 0; y < wFunctions; y++ ) + { * ( ULONG * ) &prgCode[ 6 ] = ulPCodeOffset; /* function pcode offset */ for( ul = 0; ul < ulPrgLen; ul++ ) - { - putbyte( * ( prgCode + ul ), hObjFile ); - bCheckSum += * ( prgCode + ul ); - } + { + putbyte( * ( prgCode + ul ), hObjFile ); + bCheckSum += * ( prgCode + ul ); + } ulPCodeOffset += pFunction->lPCodePos + 1; /* _ENDPROC !!! */ pFunction = pFunction->pNext; - } + } - putbyte( 256 - bCheckSum, hObjFile ); + putbyte( 256 - bCheckSum, hObjFile ); } static void DataSegment( FILE * hObjFile, BYTE * symbol, WORD wSymLen, WORD wSymbols, ULONG ulSize ) { - BYTE bCheckSum = 0; - WORD w, y; - WORD wTotalLen = 4 + ulSize; - PCOMSYMBOL pSymbol = GetFirstSymbol(); - PFUNCTION pFunction = functions.pFirst; - ULONG ulSymbolNameOffset = GetSymbolsSize() + GetPCodesSize(); - ULONG ulFunctionOffset; + BYTE bCheckSum = 0; + WORD w, y; + WORD wTotalLen = 4 + ulSize; + PCOMSYMBOL pSymbol = GetFirstSymbol(); + PFUNCTION pFunction = functions.pFirst; + ULONG ulSymbolNameOffset = GetSymbolsSize() + GetPCodesSize(); + ULONG ulFunctionOffset; - if( ! _iStartProc ) - pFunction = pFunction->pNext; + if( ! _iStartProc ) + pFunction = pFunction->pNext; - putbyte( 0xA0, hObjFile ); - bCheckSum += 0xA0; + putbyte( 0xA0, hObjFile ); + bCheckSum += 0xA0; - putword( wTotalLen, hObjFile ); - bCheckSum += LOBYTE( wTotalLen ); - bCheckSum += HIBYTE( wTotalLen ); + putword( wTotalLen, hObjFile ); + bCheckSum += LOBYTE( wTotalLen ); + bCheckSum += HIBYTE( wTotalLen ); - putbyte( 2, hObjFile ); /* 2 = _DATA segment */ - bCheckSum += 2; + putbyte( 2, hObjFile ); /* 2 = _DATA segment */ + bCheckSum += 2; - putword( 0, hObjFile ); /* 0 = offset */ + putword( 0, hObjFile ); /* 0 = offset */ - for( y = 0; y < wSymbols; y++ ) - { + for( y = 0; y < wSymbols; y++ ) + { * ( ULONG * ) symbol = ulSymbolNameOffset; if( ! IsExternal( y ) ) - { - ulFunctionOffset = ( GetFunctionPos( pSymbol->szName ) - 1 ) * - sizeof( prgFunction ); - * ( ( ULONG * ) &symbol[ 5 ] ) = ulFunctionOffset; - } + { + ulFunctionOffset = ( GetFunctionPos( pSymbol->szName ) - 1 ) * + sizeof( prgFunction ); + * ( ( ULONG * ) &symbol[ 5 ] ) = ulFunctionOffset; + } else - * ( ( ULONG * ) &symbol[ 5 ] ) = 0; + * ( ( ULONG * ) &symbol[ 5 ] ) = 0; if( pSymbol->cScope == FS_MESSAGE ) - symbol[ 4 ] = FS_PUBLIC; + symbol[ 4 ] = FS_PUBLIC; else - symbol[ 4 ] = pSymbol->cScope; + symbol[ 4 ] = pSymbol->cScope; for( w = 0; w < wSymLen; w++ ) - { - putbyte( * ( symbol + w ), hObjFile ); - bCheckSum += * ( symbol + w ); - } + { + putbyte( * ( symbol + w ), hObjFile ); + bCheckSum += * ( symbol + w ); + } ulSymbolNameOffset += strlen( pSymbol->szName ) + 1; pSymbol = pSymbol->pNext; - } + } - while( pFunction ) - { + while( pFunction ) + { for( w = 0; w < pFunction->lPCodePos; w++ ) - { - putbyte( pFunction->pCode[ w ], hObjFile ); - bCheckSum += pFunction->pCode[ w ]; - } + { + putbyte( pFunction->pCode[ w ], hObjFile ); + bCheckSum += pFunction->pCode[ w ]; + } putbyte( _ENDPROC, hObjFile ); bCheckSum += _ENDPROC; pFunction = pFunction->pNext; - } + } - pSymbol = GetFirstSymbol(); + pSymbol = GetFirstSymbol(); - while( pSymbol ) - { + while( pSymbol ) + { for( w = 0; w < strlen( pSymbol->szName ); w++ ) - { - putbyte( pSymbol->szName[ w ], hObjFile ); - bCheckSum += pSymbol->szName[ w ]; - } + { + putbyte( pSymbol->szName[ w ], hObjFile ); + bCheckSum += pSymbol->szName[ w ]; + } putbyte( 0, hObjFile ); pSymbol = pSymbol->pNext; - } + } - putbyte( 256 - bCheckSum, hObjFile ); + putbyte( 256 - bCheckSum, hObjFile ); } static void DefineSegment( FILE * hObjFile, BYTE bName, BYTE bClass, WORD wLen ) { - BYTE bCheckSum = 0; + BYTE bCheckSum = 0; - putbyte( 0x98, hObjFile ); - bCheckSum += 0x98; - putbyte( 7, hObjFile ); /* SegDef records have always this length */ - bCheckSum += 7; - putbyte( 0, hObjFile ); + putbyte( 0x98, hObjFile ); + bCheckSum += 0x98; + putbyte( 7, hObjFile ); /* SegDef records have always this length */ + bCheckSum += 7; + putbyte( 0, hObjFile ); - putbyte( 0xA9, hObjFile ); - bCheckSum += 0xA9; + putbyte( 0xA9, hObjFile ); + bCheckSum += 0xA9; - putword( wLen, hObjFile ); - bCheckSum += LOBYTE( wLen ); - bCheckSum += HIBYTE( wLen ); + putword( wLen, hObjFile ); + bCheckSum += LOBYTE( wLen ); + bCheckSum += HIBYTE( wLen ); - putbyte( bName, hObjFile ); - bCheckSum += bName; - putbyte( bClass, hObjFile ); - bCheckSum += bClass; - putbyte( 0, hObjFile ); + putbyte( bName, hObjFile ); + bCheckSum += bName; + putbyte( bClass, hObjFile ); + bCheckSum += bClass; + putbyte( 0, hObjFile ); - putbyte( 256 - bCheckSum, hObjFile ); + putbyte( 256 - bCheckSum, hObjFile ); } static void PubDef( FILE * hObjFile, char * szName, WORD wSegment, WORD wOffset ) { - BYTE bChk = 0; - BYTE bChar; - WORD wLen = 2 + 2 + strlen( szName ) + 2 + 1; + BYTE bChk = 0; + BYTE bChar; + WORD wLen = 2 + 2 + strlen( szName ) + 2 + 1; - putbyte( 0x90, hObjFile ); - bChk += 0x90; + putbyte( 0x90, hObjFile ); + bChk += 0x90; - putword( wLen, hObjFile ); - bChk += LOBYTE( wLen ); - bChk += HIBYTE( wLen ); + putword( wLen, hObjFile ); + bChk += LOBYTE( wLen ); + bChk += HIBYTE( wLen ); - putbyte( 0x00, hObjFile ); - putbyte( wSegment, hObjFile ); - bChk += wSegment; + putbyte( 0x00, hObjFile ); + putbyte( wSegment, hObjFile ); + bChk += wSegment; - putbyte( strlen( szName ), hObjFile ); - bChk += strlen( szName ); + putbyte( strlen( szName ), hObjFile ); + bChk += strlen( szName ); - while( bChar = * szName++ ) - { + while( (bChar = * szName++) ) + { putbyte( bChar, hObjFile ); bChk += bChar; - } + } - putword( wOffset, hObjFile); - bChk += LOBYTE( wOffset ); - bChk += HIBYTE( wOffset ); - putbyte( 0x00, hObjFile ); + putword( wOffset, hObjFile); + bChk += LOBYTE( wOffset ); + bChk += HIBYTE( wOffset ); + putbyte( 0x00, hObjFile ); - putbyte( 256 - bChk, hObjFile ); + putbyte( 256 - bChk, hObjFile ); } static void Fixup( FILE * hObjFile, BYTE bType, WORD wOffset, BYTE bFlags, BYTE bSymbol ) { - BYTE bCheckSum = 0; + BYTE bCheckSum = 0; - putbyte( 0x9D, hObjFile ); bCheckSum += 0x9D; + putbyte( 0x9D, hObjFile ); bCheckSum += 0x9D; - putword( 5, hObjFile ); bCheckSum += 5; + putword( 5, hObjFile ); bCheckSum += 5; - putbyte( bType + HIBYTE( wOffset ), hObjFile ); - bCheckSum += bType + HIBYTE( wOffset ); + putbyte( bType + HIBYTE( wOffset ), hObjFile ); + bCheckSum += bType + HIBYTE( wOffset ); - putbyte( LOBYTE( wOffset ), hObjFile ); - bCheckSum += LOBYTE( wOffset ); + putbyte( LOBYTE( wOffset ), hObjFile ); + bCheckSum += LOBYTE( wOffset ); - putbyte( bFlags, hObjFile ); bCheckSum += bFlags; - putbyte( bSymbol, hObjFile ); bCheckSum += bSymbol; + putbyte( bFlags, hObjFile ); bCheckSum += bFlags; + putbyte( bSymbol, hObjFile ); bCheckSum += bSymbol; - putbyte( 256 - bCheckSum, hObjFile ); + putbyte( 256 - bCheckSum, hObjFile ); } static void EnumeratedData( FILE * hObjFile, BYTE bSegment, BYTE * pData, WORD wLen, WORD wOffset ) { - BYTE bCheckSum = 0; - WORD w; + BYTE bCheckSum = 0; + WORD w; - putbyte( 0xA0, hObjFile ); - bCheckSum += 0xA0; + putbyte( 0xA0, hObjFile ); + bCheckSum += 0xA0; - putword( ( WORD ) ( wLen + 4 ), hObjFile ); - bCheckSum += LOBYTE( wLen + 4 ); - bCheckSum += HIBYTE( wLen + 4 ); + putword( ( WORD ) ( wLen + 4 ), hObjFile ); + bCheckSum += LOBYTE( wLen + 4 ); + bCheckSum += HIBYTE( wLen + 4 ); - putbyte( bSegment, hObjFile ); - bCheckSum += bSegment; + putbyte( bSegment, hObjFile ); + bCheckSum += bSegment; - putword( wOffset, hObjFile ); - bCheckSum += wOffset; + putword( wOffset, hObjFile ); + bCheckSum += wOffset; - for( w = 0; w < wLen; w++ ) - { + for( w = 0; w < wLen; w++ ) + { putbyte( * ( pData + w ), hObjFile ); bCheckSum += * ( pData + w ); - } + } - putbyte( 256 - bCheckSum, hObjFile ); + putbyte( 256 - bCheckSum, hObjFile ); } static void End( FILE * hObjFile ) { - BYTE bChk = 0; - BYTE bChar; + BYTE bChk = 0; - putbyte( 0x8A, hObjFile ); bChk += 0x8A; + putbyte( 0x8A, hObjFile ); bChk += 0x8A; - putbyte( 0x02, hObjFile ); bChk += 0x02; - putbyte( 0x00, hObjFile ); + putbyte( 0x02, hObjFile ); bChk += 0x02; + putbyte( 0x00, hObjFile ); - putbyte( 0x00, hObjFile ); bChk += 0x00; + putbyte( 0x00, hObjFile ); bChk += 0x00; - putbyte( 256 - bChk, hObjFile ); + putbyte( 256 - bChk, hObjFile ); } static void GroupDef( FILE * hObjFile, BYTE bName, BYTE * aSegs ) { - BYTE bCheckSum = 0; - WORD wRecLen = 2; - WORD w = 0; + BYTE bCheckSum = 0; + WORD wRecLen = 2; + WORD w = 0; - while( aSegs[ w++ ] ) - wRecLen += 2; + while( aSegs[ w++ ] ) + wRecLen += 2; - putbyte( 0x9A, hObjFile ); - bCheckSum += 0x9A; + putbyte( 0x9A, hObjFile ); + bCheckSum += 0x9A; - putword( wRecLen, hObjFile ); - bCheckSum += LOBYTE( wRecLen ); - bCheckSum += HIBYTE( wRecLen ); + putword( wRecLen, hObjFile ); + bCheckSum += LOBYTE( wRecLen ); + bCheckSum += HIBYTE( wRecLen ); - putbyte( bName + 1, hObjFile ); - bCheckSum += bName + 1; + putbyte( bName + 1, hObjFile ); + bCheckSum += bName + 1; - w = 0; - while( aSegs[ w ] ) - { + w = 0; + while( aSegs[ w ] ) + { putbyte( 0xFF, hObjFile ); bCheckSum += 0xFF; putbyte( aSegs[ w ], hObjFile ); bCheckSum += aSegs[ w ]; w++; - } + } - putbyte( 256 - bCheckSum, hObjFile ); + putbyte( 256 - bCheckSum, hObjFile ); } diff --git a/harbour/source/compiler/harbour.y b/harbour/source/compiler/harbour.y index 7a9bd24ca2..c2ca7e6c7a 100644 --- a/harbour/source/compiler/harbour.y +++ b/harbour/source/compiler/harbour.y @@ -28,9 +28,12 @@ #endif /* TODO: #define this for various platforms */ -#define PATH_DELIMITER "\\" +#define PATH_DELIMITER "/\\" #define IS_PATH_SEP( c ) (strchr(PATH_DELIMITER, (c))!=NULL) +#define OPT_DELIMITER "/-" +#define IS_OPT_SEP( c ) (strchr(OPT_DELIMITER, (c))!=NULL) + extern FILE * yyin; /* currently yacc parsed file */ extern int iLine; /* currently parsed file line number */ @@ -113,7 +116,10 @@ void yy_delete_buffer( YY_BUFFER_STATE ); /* yacc functions to manage multiple f void yy_switch_to_buffer( void * ); /* yacc functions to manage multiple files */ void yy_delete_buffer( void * ); /* yacc functions to manage multiple files */ #endif + +#if 0 static void __yy_memcpy( char * from, char * to, int count ); /* Bison prototype */ +#endif /* production related functions */ PFUNCTION AddFunCall( char * szFuntionName ); @@ -942,22 +948,19 @@ void EXTERNAL_LINKAGE close_on_exit( void ) } } -int main( int argc, char * argv[] ) +int harbour_main( int argc, char * argv[] ) { int iStatus = 0, iArg = 1; char szFileName[ _POSIX_PATH_MAX ]; /* filename to parse */ char *szPath =""; FILENAME *pFileName =NULL; - if( !_iQuiet ) - printf( "Harbour compiler\nbuild %i Spring 1999\n", BUILD ); - if( argc > 1 ) { /* Command line options */ while( iArg < argc ) { - if( argv[ iArg ][ 0 ] == '/' || argv[ iArg ][ 0 ] == '-' ) + if( IS_OPT_SEP(argv[ iArg ][ 0 ])) { switch( argv[ iArg ][ 1 ] ) { @@ -1070,6 +1073,9 @@ int main( int argc, char * argv[] ) iArg++; } + if( !_iQuiet ) + printf( "Harbour compiler\nbuild %i Spring 1999\n", BUILD ); + if( pFileName ) { if( !pFileName->extension ) @@ -1270,6 +1276,13 @@ FILENAME *SplitFilename( char *szFilename ) */ char *MakeFilename( char *szFileName, FILENAME *pFileName ) { +#if 0 + fprintf(stderr, "path: |%s|\n" + "name: |%s|\n" + " ext: |%s|\n", + pFileName->path, pFileName->name, pFileName->extension); +#endif + if( pFileName->path && pFileName->path[ 0 ] ) { /* we have not empty path specified */