/*
* Copyright (C) 1995-1997 Christopher D. Granz
*
* This header may not be removed.
*
* Refer to the file "License" included in this package for further
* information and before using any of the following.
*/
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include "emerald.h"
#include "embc.h"
/*
* Globals
*/
char cNullChar;
const struct code_name_type cnKeywordTable[] =
{
{ "END", INSTR_END },
{ "NEW_INT", INSTR_NEW_INT },
{ "NEW_FLOAT", INSTR_NEW_FLOAT },
{ "NEW_STRING", INSTR_NEW_STRING },
{ "NEW_OBJECT", INSTR_NEW_OBJECT },
{ "NEW_ARRAY", INSTR_NEW_ARRAY },
{ "PUSH_ZERO", INSTR_PUSH_ZERO },
{ "PUSH_ONE", INSTR_PUSH_ONE },
{ "PUSH_INT1", INSTR_PUSH_INT1 },
{ "PUSH_INT2", INSTR_PUSH_INT2 },
{ "PUSH_INT4", INSTR_PUSH_INT4 },
{ "PUSH_FLOAT4", INSTR_PUSH_FLOAT4 },
{ "PUSH_FLOAT8", INSTR_PUSH_FLOAT8 },
{ "PUSH_STRING", INSTR_PUSH_STRING },
{ "PUSH_ARRAY", INSTR_PUSH_ARRAY },
{ "PUSH_GLOBAL", INSTR_PUSH_GLOBAL },
{ "PUSH_LOCAL", INSTR_PUSH_LOCAL },
{ "PUSH_INDEX", INSTR_PUSH_INDEX },
{ "POP", INSTR_POP },
{ "CLEAR_GLOBAL", INSTR_CLEAR_GLOBAL },
{ "CLEAR_LOCAL", INSTR_CLEAR_LOCAL },
{ "ASSIGN_GLOBAL", INSTR_ASSIGN_GLOBAL },
{ "ASSIGN_LOCAL", INSTR_ASSIGN_LOCAL },
{ "ASSIGN_INDEX", INSTR_ASSIGN_INDEX },
{ "MULTIPLY", INSTR_MULTIPLY },
{ "DIVIDE", INSTR_DIVIDE },
{ "MODULUS", INSTR_MODULUS },
{ "ADD", INSTR_ADD },
{ "SUBTRACT", INSTR_SUBTRACT },
{ "RSHIFT", INSTR_RSHIFT },
{ "LSHIFT", INSTR_LSHIFT },
{ "AND", INSTR_AND },
{ "XOR", INSTR_XOR },
{ "OR", INSTR_OR },
{ "ONES_COMPLEMENT", INSTR_ONES_COMPLEMENT },
{ "JUMP", INSTR_JUMP },
{ "CAST", INSTR_CAST },
{ "COMPARE", INSTR_COMPARE },
{ "CALL_BUILTIN_FUNC", INSTR_CALL_BUILTIN_FUNC },
{ "CALL_FUNC", INSTR_CALL_FUNC },
{ "RETURN", INSTR_RETURN },
{ NULL, 0 }
};
/*
* Functions
*/
int main( int iArgC, char *pArgV[] )
{
FILE *pFile;
FILE *pFileOut;
char cBuf[1028];
char *pBuf;
char c[2];
int i;
if ( iArgC < 2 )
{
fprintf( stderr,
"\nUsage: %s [-c|d] <object files|code files>\n", pArgV[0] );
return ( 0 );
}
if ( iArgC > 1 )
{
strncpy( cBuf, pArgV[1], 1024 );
cBuf[1024] = '\0';
pFile = open_file( cBuf, "r" );
if ( iArgC > 2 )
strncpy( cBuf, pArgV[2], 1024 );
else
{
pBuf = strrchr( cBuf, '.' );
if ( !strcmp( pBuf, ".emb" ) || !strcmp( pBuf, ".EMB" ) )
strcpy( pBuf, ".emo" );
else
strcat( pBuf, ".emo" );
}
}
else
{
pFile = stdin;
strcpy( cBuf, "_a.emo" );
}
if ( ( pFileOut = fopen( cBuf, "wb" ) ) == NULL )
{
fprintf( stderr, "\n%s: %s.\n", pArgV[0], strerror( errno ) );
if ( pFile != stdin )
close_file( pFile );
return ( 0 );
}
if ( pFile != stdin )
fprintf( stderr, "%s: %s -> %s\n", pArgV[0], pArgV[1], cBuf );
c[0] = fget_letter( pFile );
while ( feof( pFile ) == 0 )
{
switch ( c[0] )
{
case 'I':
case 'i':
pBuf = fget_word( pFile );
for ( i = 0; cnKeywordTable[i].pKeyword != NULL; i++ )
{
if ( strcmp( cnKeywordTable[i].pKeyword, pBuf ) == 0 )
break;
}
if ( cnKeywordTable[i].pKeyword == NULL )
{
error( "Unknown instruction `%s'.", pBuf );
break;
}
i = fwrite( &cnKeywordTable[i].iByteCode, 1, 1, pFileOut );
if ( i < 0 )
error( "%s: %s.", cBuf, strerror( errno ) );
break;
case 'L':
case 'l':
pBuf = fget_word( pFile );
if ( strcmp( pBuf, "int1" ) == 0 )
{
char cV = (char) atoi( fget_word( pFile ) );
i = fwrite( &cV, sizeof( char ), 1, pFileOut );
if ( i < 0 )
error( "%s: %s.", cBuf, strerror( errno ) );
}
else if ( strcmp( pBuf, "int2" ) == 0 )
{
i2 iV = (i2) atoi( fget_word( pFile ) );
i = fwrite( &iV, sizeof( i2 ), 1, pFileOut );
if ( i < 0 )
error( "%s: %s.", cBuf, strerror( errno ) );
}
else if ( strcmp( pBuf, "int4" ) == 0 )
{
i4 iV = (i4) atol( fget_word( pFile ) );
i = fwrite( &iV, sizeof( i4 ), 1, pFileOut );
if ( i < 0 )
error( "%s: %s.", cBuf, strerror( errno ) );
}
else if ( strcmp( pBuf, "float4" ) == 0 )
{
f4 fV = (f4) atof( fget_word( pFile ) );
i = fwrite( &fV, sizeof( f4 ), 1, pFileOut );
if ( i < 0 )
error( "%s: %s.", cBuf, strerror( errno ) );
}
else if ( strcmp( pBuf, "float8" ) == 0 )
{
f8 fV = (f8) strtod( fget_word( pFile ),
(char **) NULL );
i = fwrite( &fV, sizeof( f8 ), 1, pFileOut );
if ( i < 0 )
error( "%s: %s.", cBuf, strerror( errno ) );
}
else if ( strcmp( pBuf, "string" ) == 0 )
{
pBuf = fget_string( pFile );
i = fwrite( pBuf, 1, strlen( pBuf ), pFileOut );
if ( i < 0 )
error( "%s: %s.", cBuf, strerror( errno ) );
}
else
error( "Unknown literal type `%s'.", pBuf );
break;
default :
error( "Unknown symbol `%s'.", c );
/* Fall through. */
case ';':
while ( c[0] != '\n' && c[0] != EOF )
c[0] = getc( pFile );
if ( c[0] == '\n' )
lCurrentLine++;
break;
}
c[0] = fget_letter( pFile );
}
fclose( pFileOut );
if ( pFile != stdin )
close_file( pFile );
return ( 0 );
}
/*
* End of main.c
*/