/* * 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 "emc.h" /* * Globals */ extern FILE * yyin; extern FILE * yyout; extern char * yytext; char cNullChar; unsigned short int usiSymbolListSize; SYM_ENTRY * pSymbolList; unsigned short int usiFuncListSize; FUNC_ENTRY * pFuncList; /* * Functions */ static long lParseLevel = 0; static void show_parse_tree( NODE *pNode ) { if ( pNode == NULL ) return; lParseLevel++; printf( "\nlevel: %ld; left: ", lParseLevel ); show_parse_tree( pNode->uL.pLeft ); printf( "; right: " ); show_parse_tree( pNode->uR.pRight ); lParseLevel--; } int main( int iArgC, char *pArgV[] ) { char cBuf[1028]; char *pBuf; if ( iArgC < 2 ) { fprintf( stderr, "\nUsage: %s [-c] <object files|code files>\n", pArgV[0] ); return ( 0 ); } if ( iArgC > 1 ) { strncpy( cBuf, pArgV[1], 1024 ); cBuf[1024] = '\0'; yyin = open_file( cBuf, "r" ); if ( iArgC > 2 ) strncpy( cBuf, pArgV[2], 1024 ); else { pBuf = strrchr( cBuf, '.' ); if ( !strcmp( pBuf, ".em" ) || !strcmp( pBuf, ".EM" ) ) strcpy( pBuf, ".emo" ); else strcat( pBuf, ".emo" ); } } else { yyin = stdin; strcpy( cBuf, "_a.emo" ); } if ( ( yyout = fopen( cBuf, "wb" ) ) == NULL ) { fprintf( stderr, "\n%s: %s.\n", pArgV[0], strerror( errno ) ); if ( yyin != stdin ) close_file( yyin ); return ( 0 ); } if ( yyin != stdin ) fprintf( stderr, "%s: %s -> %s\n", pArgV[0], pArgV[1], cBuf ); while ( feof( yyin ) == 0 ) { if ( yyparse( ) == 0 ) fprintf( stderr, "Parse successful.\n" ); else { fprintf( stderr, "Parse failed.\n" ); break; } printf( "Parse tree: " ); show_parse_tree( pNodeTree ); } write_emo( yyout ); fclose( yyout ); if ( yyin != stdin ) close_file( yyin ); return ( 0 ); } void write_emo( FILE *pFile ) { SYM_ENTRY *pSymbol = pSymbolList; FUNC_ENTRY *pFunc = pFuncList; i4 i = 0L; i4 iIndex; i = EM_MAGIC_NUMBER; fwrite( &i, sizeof( i4 ), 1, pFile ); i = 0L; i = EM_LOADER_VERSION; fwrite( &i, 1, 1, pFile ); fwrite( &usiSymbolListSize, sizeof( i2 ), 1, pFile ); for ( iIndex = 0L; iIndex < usiSymbolListSize; iIndex++ ) { i = 0L; i = strlen( pSymbol->pSymbol ); fwrite( &i, sizeof( i2 ), 1, pFile ); fwrite( pSymbol->pSymbol, 1, i, pFile ); } fwrite( &usiFuncListSize, sizeof( i2 ), 1, pFile ); for ( iIndex = 0L; iIndex < usiFuncListSize; iIndex++ ) { fwrite( &pFunc->fFuncFlags, sizeof( i4 ), 1, pFile ); fwrite( &pFunc->iNumArgs, 1, 1, pFile ); fwrite( &pFunc->iNumReturn, 1, 1, pFile ); fwrite( &pFunc->usiSymName, sizeof( i2 ), 1, pFile ); fwrite( &pFunc->ulCodeSize, sizeof( i4 ), 1, pFile ); fwrite( pFunc->pCode, pFunc->ulCodeSize, 1, pFile ); } } /* * End of main.c */