]> git.sur5r.net Git - cc65/commitdiff
New %s inline asm format specifier
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 16 Sep 2003 20:35:37 +0000 (20:35 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 16 Sep 2003 20:35:37 +0000 (20:35 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@2442 b7a2c559-68d2-44c3-8de9-860c34a00d81

doc/cc65.sgml
src/cc65/asmstmt.c

index c0599be2ae6ed6a5982eadc28691e1df6915983d..d574a3dd05da890a767a4411ac3a435e30dbe319 100644 (file)
@@ -910,6 +910,7 @@ the format specifier before passing the assembly code line to the backend.
   <item><tt/%l/ - Numerical 32 bit value
   <item><tt/%v/ - Assembler name of a (global) variable or function
   <item><tt/%o/ - Stack offset of a (local) variable
+  <item><tt/%s/ - The argument is converted to a string
   <item><tt/%%/ - The % sign itself
 </itemize><p>
 
@@ -949,7 +950,7 @@ variables or functions into your asm statements. Code like this
 <p>
 
 may stop working if the way, the compiler generates these names is changed in
-a future version.
+a future version. Instead use the format specifiers from the table above.
 <p>
 
 
index 7552ede480db3f89c63c045db0281f5e6149420c..d680f0b694a004a7d33866517f8dad959b9e7c76 100644 (file)
@@ -7,8 +7,8 @@
 /*                                                                           */
 /*                                                                           */
 /* (C) 2001-2003 Ullrich von Bassewitz                                       */
-/*               Wacholderweg 14                                             */
-/*               D-70597 Stuttgart                                           */
+/*               Römerstrasse 52                                             */
+/*               D-70794 Filderstadt                                         */
 /* EMail:        uz@musoftware.de                                            */
 /*                                                                           */
 /*                                                                           */
@@ -274,6 +274,41 @@ static void ParseLVarArg (StrBuf* T, unsigned Arg)
 
 
 
+static void ParseStrArg (StrBuf* T, unsigned Arg attribute ((unused)))
+/* Parse the %s format specifier */
+{
+    ExprDesc Expr;
+    char Buf [64];
+
+    /* We expect an argument separated by a comma */
+    ConsumeComma ();
+
+    /* Check what comes */
+    switch (CurTok.Tok) {
+
+        case TOK_IDENT:
+            /* Identifier */
+            SB_AppendStr (T, CurTok.Ident);
+            NextToken ();
+            break;
+
+        case TOK_SCONST:
+            /* String constant */
+            SB_AppendStr (T, GetLiteral (CurTok.IVal));
+            ResetLiteralPoolOffs (CurTok.IVal);
+            NextToken ();
+            break;
+
+        default:
+            ConstSubExpr (hie1, InitExprDesc (&Expr));
+            xsprintf (Buf, sizeof (Buf), "%ld", Expr.ConstVal);
+            SB_AppendStr (T, Buf);
+            break;
+    }
+}
+
+
+
 static void ParseAsm (void)
 /* Parse the contents of the ASM statement */
 {
@@ -304,6 +339,7 @@ static void ParseAsm (void)
      *   %l    - Numerical 32 bit value
      *   %v    - Assembler name of a (global) variable
      *   %o    - Stack offset of a (local) variable
+     *   %s     - Any argument converted to a string (almost)
      *   %%    - The % sign
      */
     Arg = 0;
@@ -322,12 +358,13 @@ static void ParseAsm (void)
                    ++Arg;
             C = SB_Get (&S);
             switch (C) {
+                case '%':   SB_AppendChar (&T, '%');        break;
                 case 'b':   ParseByteArg (&T, Arg);         break;
-                case 'w':   ParseWordArg (&T, Arg);         break;
                 case 'l':   ParseLongArg (&T, Arg);         break;
-                case 'v':   ParseGVarArg (&T, Arg);         break;
                 case 'o':   ParseLVarArg (&T, Arg);         break;
-                case '%':   SB_AppendChar (&T, '%');        break;
+                case 's':   ParseStrArg (&T, Arg);          break;
+                case 'v':   ParseGVarArg (&T, Arg);         break;
+                case 'w':   ParseWordArg (&T, Arg);         break;
                 default:
                     Error ("Error in __asm__ format specifier %u", Arg);
                     AsmErrorSkip ();