]> git.sur5r.net Git - cc65/commitdiff
Fixed bug with braces in initializer lists
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 23 Sep 2004 17:34:03 +0000 (17:34 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 23 Sep 2004 17:34:03 +0000 (17:34 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@3193 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/cc65/declare.c
src/cc65/expr.c
src/cc65/expr.h

index d71938c6ffc95ca186a7690f59bc7c98a1d8780a..44b8ddf05454b4b4ad42aa3c4b53274dea6288d2 100644 (file)
@@ -1211,6 +1211,50 @@ static void ClosingCurlyBraces (unsigned BracesExpected)
 
 
 
+static void DefineData (ExprDesc* Expr)
+/* Output a data definition for the given expression */
+{
+    switch (ED_GetLoc (Expr)) {
+
+        case E_LOC_ABS:
+            /* Absolute: numeric address or const */
+                   g_defdata (TypeOf (Expr->Type) | CF_CONST, Expr->IVal, 0);
+            break;
+
+        case E_LOC_GLOBAL:
+            /* Global variable */
+            g_defdata (CF_EXTERNAL, Expr->Name, Expr->IVal);
+            break;
+
+        case E_LOC_STATIC:
+        case E_LOC_LITERAL:
+            /* Static variable or literal in the literal pool */
+            g_defdata (CF_STATIC, Expr->Name, Expr->IVal);
+            break;
+
+        case E_LOC_REGISTER:
+                   /* Register variable. Taking the address is usually not
+                    * allowed.
+                    */
+                   if (IS_Get (&AllowRegVarAddr) == 0) {
+                       Error ("Cannot take the address of a register variable");
+                   }
+            g_defdata (CF_REGVAR, Expr->Name, Expr->IVal);
+            break;
+
+        case E_LOC_STACK:
+        case E_LOC_PRIMARY:
+        case E_LOC_EXPR:
+            Error ("Non constant initializer");
+            break;
+
+               default:
+                   Internal ("Unknown constant type: 0x%04X", ED_GetLoc (Expr));
+    }
+}
+
+
+
 static unsigned ParseScalarInit (type* T)
 /* Parse initializaton for scalar data types. Return the number of data bytes. */
 {
@@ -1276,10 +1320,24 @@ static unsigned ParseArrayInit (type* T, int AllowFlexibleMembers)
     long ElementCount    = GetElementCount (T);
 
     /* Special handling for a character array initialized by a literal */
-    if (IsTypeChar (ElementType) && CurTok.Tok == TOK_SCONST) {
+    if (IsTypeChar (ElementType) &&
+        (CurTok.Tok == TOK_SCONST ||
+        (CurTok.Tok == TOK_LCURLY && NextTok.Tok == TOK_SCONST))) {
 
         /* Char array initialized by string constant */
-        const char* Str = GetLiteral (CurTok.IVal);
+        int NeedParen;
+        const char* Str;
+
+        /* If we initializer is enclosed in brackets, remember this fact and
+         * skip the opening bracket.
+         */
+        NeedParen = (CurTok.Tok == TOK_LCURLY);
+        if (NeedParen) {
+            NextToken ();
+        }
+
+        /* Get the initializer string and its size */
+        Str = GetLiteral (CurTok.IVal);
         Count = GetLiteralPoolOffs () - CurTok.IVal;
 
         /* Translate into target charset */
@@ -1302,6 +1360,13 @@ static unsigned ParseArrayInit (type* T, int AllowFlexibleMembers)
         ResetLiteralPoolOffs (CurTok.IVal);
         NextToken ();
 
+        /* If the initializer was enclosed in curly braces, we need a closing
+         * one.
+         */
+        if (NeedParen) {
+            ConsumeRCurly ();
+        }
+
     } else {
 
         /* Curly brace */
index b539ba13845645a74b1dd3d1a118b75a58de522b..b4704009604a470d37f4d16dac8977e472ec4306 100644 (file)
@@ -181,44 +181,6 @@ static unsigned typeadjust (ExprDesc* lhs, ExprDesc* rhs, int NoPush)
 
 
 
-void DefineData (ExprDesc* Expr)
-/* Output a data definition for the given expression */
-{
-    switch (ED_GetLoc (Expr)) {
-
-        case E_LOC_ABS:
-            /* Absolute: numeric address or const */
-           g_defdata (TypeOf (Expr->Type) | CF_CONST, Expr->IVal, 0);
-            break;
-
-        case E_LOC_GLOBAL:
-            /* Global variable */
-            g_defdata (CF_EXTERNAL, Expr->Name, Expr->IVal);
-            break;
-
-        case E_LOC_STATIC:
-        case E_LOC_LITERAL:
-            /* Static variable or literal in the literal pool */
-            g_defdata (CF_STATIC, Expr->Name, Expr->IVal);
-            break;
-
-        case E_LOC_REGISTER:
-           /* Register variable. Taking the address is usually not
-            * allowed.
-            */
-           if (IS_Get (&AllowRegVarAddr) == 0) {
-               Error ("Cannot take the address of a register variable");
-           }
-            g_defdata (CF_REGVAR, Expr->Name, Expr->IVal);
-            break;
-
-               default:
-           Internal ("Unknown constant type: 0x%04X", ED_GetLoc (Expr));
-    }
-}
-
-
-
 static int kcalc (token_t tok, long val1, long val2)
 /* Calculate an operation with left and right operand constant. */
 {
index e166dd5ee6de31605e55acd4be2b6d5b3b1d11d1..990bed683302d36e5e5927b4eec1bd9e250243fd 100644 (file)
@@ -82,9 +82,6 @@ void hie1 (ExprDesc* lval);
 void hie0 (ExprDesc* Expr);
 /* Parse comma operator. */
 
-void DefineData (ExprDesc* lval);
-/* Output a data definition for the given expression */
-
 
 
 /* End of expr.h */