summaryrefslogtreecommitdiff
path: root/ecomp-c/ec.c
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2020-05-31 15:02:46 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2020-05-31 15:02:46 +0200
commit391b6e0958be1f6d00c5f3c7e57fee87bec965ef (patch)
tree9400faddb3f157657c0e8b5d23a00abf9ebe0c63 /ecomp-c/ec.c
parent0307ad956911c1fbb526e002e2611f2037d986f2 (diff)
downloadcompilertests-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.c44
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'",