aliasgen.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 557 行 · 第 1/2 页

C
557
字号

/*
 * Make an ix86 assembler file defining the alias.
 */
static void make_asm_ix86( FILE *miffile, struct Alias *alias, char *outdir )
/***************************************************************************/
{
    char                filename[_MAX_PATH];
    FILE *              asmfile;

    /*** Open the assembler file ***/
    sprintf( filename, "%s_i%6s.asm", outdir, alias->filename );
    asmfile = fopen( filename, "wt" );
    if( asmfile == NULL ) {
        FatalError( "Cannot create '%s'.", filename );
    }

    /*** Write data to it ***/
    fprintf( asmfile, "include mdef.inc\n" );
    fprintf( asmfile, "alias_function %s, %s\n", alias->aliasname,
             alias->realname );
    fprintf( asmfile, "end\n" );
    if( ferror( asmfile ) ) {
        FatalError( "Cannot write to '%s'.", filename );
    }
    fclose( asmfile );

    sprintf( filename, "_i%6s.obj", alias->filename );
    update_mif_file( miffile, filename, alias );
}


/*
 * Make a PowerPC assembler file defining the alias.
 */
static void make_asm_ppc( FILE *miffile, struct Alias *alias, char *outdir )
/**************************************************************************/
{
    char                filename[_MAX_PATH];
    FILE *              asmfile;

    /*** Open the assembler file ***/
    sprintf( filename, "%s_p%6s.asm", outdir, alias->filename );
    asmfile = fopen( filename, "wt" );
    if( asmfile == NULL ) {
        FatalError( "Cannot create '%s'.", filename );
    }

    /*** Write data to it ***/
    fprintf( asmfile, "\t.text\n" );
    fprintf( asmfile, "\t.globl\t%s\n", alias->aliasname );
    fprintf( asmfile, "%s:\n", alias->aliasname );
    fprintf( asmfile, "\tb\t%s\n", alias->realname );
    if( ferror( asmfile ) ) {
        FatalError( "Cannot write to '%s'.", filename );
    }
    fclose( asmfile );

    sprintf( filename, "_p%6s.obj", alias->filename );
    update_mif_file( miffile, filename, alias );
}


/*
 * Make a MIPS assembler file defining the alias.
 */
static void make_asm_mips( FILE *miffile, struct Alias *alias, char *outdir )
/***************************************************************************/
{
    char                filename[_MAX_PATH];
    FILE *              asmfile;

    /*** Open the assembler file ***/
    sprintf( filename, "%s_m%6s.asm", outdir, alias->filename );
    asmfile = fopen( filename, "wt" );
    if( asmfile == NULL ) {
        FatalError( "Cannot create '%s'.", filename );
    }

    /*** Write data to it ***/
    fprintf( asmfile, "\t.text\n" );
    fprintf( asmfile, "\t.globl\t%s\n", alias->aliasname );
    fprintf( asmfile, "%s:\n", alias->aliasname );
    fprintf( asmfile, "\tj\t%s\n", alias->realname );
    if( ferror( asmfile ) ) {
        FatalError( "Cannot write to '%s'.", filename );
    }
    fclose( asmfile );

    sprintf( filename, "_m%6s.obj", alias->filename );
    update_mif_file( miffile, filename, alias );
}


/*
 * Create an alias.
 */
static void do_alias( FILE *miffile, struct Alias *alias, char *outdir )
/**********************************************************************/
{
    struct Alias        aliasaxp;
    struct Alias        aliasix86;
    struct Alias        aliasppc;
    struct Alias        aliasmips;
    struct SysElem *    syselem;

    /*** Initialize the CPU specific aliases ***/
    aliasix86.filename = alias->filename;
    aliasix86.realname = alias->realname;
    aliasix86.aliasname = alias->aliasname;
    aliasix86.systems = NULL;
    aliasaxp.filename = alias->filename;
    aliasaxp.realname = alias->realname;
    aliasaxp.aliasname = alias->aliasname;
    aliasaxp.systems = NULL;
    aliasppc.filename = alias->filename;
    aliasppc.realname = alias->realname;
    aliasppc.aliasname = alias->aliasname;
    aliasppc.systems = NULL;
    aliasmips.filename = alias->filename;
    aliasmips.realname = alias->realname;
    aliasmips.aliasname = alias->aliasname;
    aliasmips.systems = NULL;

    /*** Separate into groups by CPU type ***/
    syselem = alias->systems;
    while( syselem != NULL ) {
        if( !strcmp( syselem->system, "nta" ) ) {               /* AXP */
            add_system( &aliasaxp, syselem->system );
        } else if( !strcmp( syselem->system, "axp" ) ) {        /* AXP */
            add_system( &aliasaxp, syselem->system );
        } else if( !strcmp( syselem->system, "ntp" ) ) {        /* PPC */
            add_system( &aliasppc, syselem->system );
        } else if( !strcmp( syselem->system, "op" ) ) {         /* PPC */
            add_system( &aliasppc, syselem->system );
        } else if( !strcmp( syselem->system, "lpc" ) ) {        /* PPC */
            add_system( &aliasppc, syselem->system );
        } else if( !strcmp( syselem->system, "ppc" ) ) {        /* PPC */
            add_system( &aliasppc, syselem->system );
        } else if( !strcmp( syselem->system, "lmp" ) ) {        /* MIPS */
            add_system( &aliasmips, syselem->system );
        } else if( !strcmp( syselem->system, "mps" ) ) {        /* MIPS */
            add_system( &aliasmips, syselem->system );
        } else {                                                /* x86 */
            add_system( &aliasix86, syselem->system );
        }
        syselem = syselem->next;
    }

    /*** Build any necessary assembler files ***/
    if( aliasix86.systems != NULL ) {
        make_asm_ix86( miffile, &aliasix86, outdir );
    }
    if( aliasaxp.systems != NULL ) {
        make_asm_axp( miffile, &aliasaxp, outdir );
    }
    if( aliasppc.systems != NULL ) {
        make_asm_ppc( miffile, &aliasppc, outdir );
    }
    if( aliasppc.systems != NULL ) {
        make_asm_mips( miffile, &aliasmips, outdir );
    }
}


/*
 * Handle one line.  Returns 0 if at EOF, and a positive value if there's
 * more data to handle.
 */
static int do_line( FILE *infile, FILE *miffile, char *outdir )
/*************************************************************/
{
    static int          curline;
    char                line[1024];
    char *              p;
    int                 numwords;
    char **             words;
    struct Alias        alias;
    int                 count;

    /*** Prepare the next line ***/
    p = fgets( line, 1024, infile );
    if( p == NULL ) {
        if( ferror( infile ) ) {
            FatalError( "Error reading line %d", curline );
        } else if( feof( infile ) ) {
            return( 0 );
        } else {
            Zoinks();
        }
    }
    if( line[0] == '#' ) {
        curline++;
        return( 2 );                    /* skip comment lines */
    }

    /*** Extract the individual words ***/
    numwords = parse_words( line, NULL );
    if( numwords == -1 ) {
        FatalError( "Error on line %d", curline );
        return( -1 );
    }
    if( numwords == 0 ) {               /* skip blank lines */
        curline++;
        return( 2 );
    }
    words = (char **)AllocMem( (numwords+1) * sizeof(char*) );
    numwords = parse_words( line, words );
    if( numwords < 4 ) {
        FatalError( "Error on line %d", curline );
        return( -1 );
    }

    /*** Construct an Alias structure and create the alias ***/
    alias.filename = words[0];
    alias.realname = words[1];
    alias.aliasname = words[2];
    alias.systems = NULL;
    for( count=3; words[count]!=NULL; count++ ) {   /* build system list */
        add_system( &alias, words[count] );
    }
    do_alias( miffile, &alias, outdir );

    curline++;
    return( 1 );
}


/*
 * Program entry point.
 */
int main( int argc, char *argv[] )
/*********************************/
{
    FILE *              infile;
    FILE *              miffile;
    char *              outdir;
    int                 alive = 1;
    int                 rc;

    /*** Parse the command line ***/
    if( argc != 4 ) {
        printf( "Usage: ALIASGEN <alias_file> <output_dir\\> <objects_mif_file>\n" );
        return( EXIT_FAILURE );
    }
    infile = fopen( argv[1], "rt" );    /* open alias file */
    if( infile == NULL ) {
        FatalError( "Cannot open '%s'.", argv[1] );
    }
    outdir = argv[2];                   /* get output directory */
    miffile = fopen( argv[3], "wt" );   /* open objects.mif file */
    if( miffile == NULL ) {
        FatalError( "Cannot create '%s'.", argv[3] );
    }

    /*** Handle the alias entries, one by one ***/
    while( alive ) {
        rc = do_line( infile, miffile, outdir );
        switch( rc ) {
          case 0:                       /* ok, but not done */
            alive = 0;
            break;
          case 2:                       /* comment */
            break;
          case 1:                       /* got one more */
            fputc( '.', stdout );
            fflush( stdout );
            break;
          default:
            Zoinks();
            break;
        }
    }
    fputc( '\n', stdout );

    return( EXIT_SUCCESS );
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?