diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2020-05-31 15:02:46 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2020-05-31 15:02:46 +0200 |
commit | 391b6e0958be1f6d00c5f3c7e57fee87bec965ef (patch) | |
tree | 9400faddb3f157657c0e8b5d23a00abf9ebe0c63 /ecomp-c/ec.c | |
parent | 0307ad956911c1fbb526e002e2611f2037d986f2 (diff) | |
download | compilertests-391b6e0958be1f6d00c5f3c7e57fee87bec965ef.tar.gz compilertests-391b6e0958be1f6d00c5f3c7e57fee87bec965ef.tar.bz2 |
added support for multi-operand db in asm-i386 for string definitions
added string and character tests
Diffstat (limited to 'ecomp-c/ec.c')
-rw-r--r-- | ecomp-c/ec.c | 44 |
1 files changed, 29 insertions, 15 deletions
diff --git a/ecomp-c/ec.c b/ecomp-c/ec.c index 80bc815..87a3012 100644 --- a/ecomp-c/ec.c +++ b/ecomp-c/ec.c @@ -203,8 +203,14 @@ static int isDigit( int c ) static int isSpecial( int c ) { - if( c == '_' ) return 1; - return 0; + switch( c ) { + case '_': + case ' ': + return 1; + + default: + return 0; + } } static void skipWhite( void ) @@ -1733,6 +1739,9 @@ static void prologue( void ) static void reserve_initialize( Symbol *symbol ) { + int i; + int len; + switch( symbol->type->class ) { case SYMBOL_CLASS_SIMPLE_TYPE: if( symbol->type == integer_type ) { @@ -1751,28 +1760,33 @@ static void reserve_initialize( Symbol *symbol ) Emit( "\n" ); break; - case SYMBOL_CLASS_ARRAY_TYPE: { - int i = 0; - + case SYMBOL_CLASS_ARRAY_TYPE: if( symbol->type->type == character_type ) { - int len = strlen( symbol->string_value ); - Emit( "db \"" ); - while( i < len ) { - Emit( "%c", symbol->string_value[i] ); - i++; + i = 0; + Emit( "db " ); + if( symbol->string_value != NULL ) { + Emit( "\"" ); + len = strlen( symbol->string_value ); + while( i < len ) { + Emit( "%c", symbol->string_value[i] ); + i++; + } + Emit( "\"" ); } - Emit( "\"" ); while( i < symbol->type->dim ) { - Emit( "$00" ); + if( i > 0 ) { + Emit( ", " ); + } + Emit( "0" ); + i++; } Emit( "\n" ); } else { for( i = 0; i < symbol->type->dim; i++ ) { reserve_initialize( symbol->type ); } - } - - } break; + } + break; default: Abort( "Unhandled variable space reservation and initializiation for complex type '%s' in variable '%s'", |