]> git.sur5r.net Git - cc65/commitdiff
Added the .TCOUNT function
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 15 Jul 2000 10:33:32 +0000 (10:33 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 15 Jul 2000 10:33:32 +0000 (10:33 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@151 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ca65/expr.c
src/ca65/pseudo.c
src/ca65/scanner.c
src/ca65/scanner.h

index 44c7524d138e02b6fc3b60c7f147fcbf7bd4295a..0bad48328d373f969f4c273223122303c04df1c7 100644 (file)
@@ -117,7 +117,7 @@ static void FreeExprNode (ExprNode* E)
 /*             Dump an expression tree on stdout for debugging              */
 /*****************************************************************************/
 
-            
+
 
 static void InternalDumpExpr (ExprNode* Expr)
 /* Dump an expression in UPN */
@@ -467,6 +467,44 @@ static int FuncReferenced (void)
 
 
 
+static int FuncTCount (void)
+/* Handle the .TCOUNT function */
+{
+    /* We have a list of tokens that ends with the closing paren. Skip
+     * the tokens, handling nested braces and count them.
+     */
+    int      Count  = 0;
+    unsigned Parens = 0;
+    while (Parens != 0 || Tok != TOK_RPAREN) {
+
+       /* Check for end of line or end of input. Since the calling function
+        * will check for the closing paren, we don't need to print an error
+        * here, just bail out.
+        */
+       if (Tok == TOK_SEP || Tok == TOK_EOF) {
+           break;
+       }
+
+       /* One more token */
+       ++Count;
+
+       /* Keep track of the nesting level */
+       switch (Tok) {
+           case TOK_LPAREN:    ++Parens;       break;
+           case TOK_RPAREN:    --Parens;       break;
+           default:                            break;
+       }
+
+       /* Skip the token */
+       NextTok ();
+    }
+
+    /* Return the number of tokens */
+    return Count;
+}
+
+
+
 static int FuncXMatch (void)
 /* Handle the .XMATCH function */
 {
@@ -492,7 +530,7 @@ static ExprNode* Function (int (*F) (void))
     NextTok ();
 
     /* Call the function itself */
-    Result = (F () != 0);
+    Result = F ();
 
     /* Closing brace must follow */
     ConsumeRParen ();
@@ -509,7 +547,7 @@ static ExprNode* Factor (void)
     SymEntry* S;
 
     switch (Tok) {
-
+                 
        case TOK_INTCON:
        case TOK_CHARCON:
            N = LiteralExpr (IVal);
@@ -620,6 +658,10 @@ static ExprNode* Factor (void)
            N = Function (FuncReferenced);
            break;
 
+       case TOK_TCOUNT:
+           N = Function (FuncTCount);
+           break;
+
        case TOK_XMATCH:
            N = Function (FuncXMatch);
            break;
index ea222968f0dd7f9f21514a5bd909a15dde9d3db2..f41a3968b68e3b3c525a4c256f13b4cea1173dfc 100644 (file)
@@ -1164,6 +1164,7 @@ static CtrlDesc CtrlCmdTab [] = {
     { ccNone,          DoSmart         },
     { ccNone,                  DoUnexpected    },      /* .STRING */
     { ccNone,          DoSunPlus       },
+    { ccNone,          DoUnexpected    },      /* .TCOUNT */
     { ccNone,          DoWord          },
     { ccNone,                  DoUnexpected    },      /* .XMATCH */
     { ccNone,          DoZeropage      },
index c737f6c6fa08c7c843451aa9e09025a71a5b75e1..e51009cfa7984f1f098c6c004b1e53080e3b0c8f 100644 (file)
@@ -221,6 +221,7 @@ struct DotKeyword {
     { "SMART",         TOK_SMART       },
     { "STRING",                TOK_STRING      },
     { "SUNPLUS",       TOK_SUNPLUS     },
+    { "TCOUNT",                TOK_TCOUNT      },
     { "WORD",          TOK_WORD        },
     { "XMATCH",                TOK_XMATCH      },
     { "XOR",           TOK_BXOR        },
index dea58299424fdd5cb9e06a2d4ab651910ec631b4..8f5e4486ca6fb159177fc5ad2bfff90ff5b0e29a 100644 (file)
@@ -183,13 +183,14 @@ enum Token {
     TOK_REFERENCED,
     TOK_RELOC,
     TOK_REPEAT,
-    TOK_RES, 
+    TOK_RES,
     TOK_RIGHT,
     TOK_RODATA,
     TOK_SEGMENT,
     TOK_SMART,
     TOK_STRING,
     TOK_SUNPLUS,
+    TOK_TCOUNT,
     TOK_WORD,
     TOK_XMATCH,
     TOK_ZEROPAGE,