]> git.sur5r.net Git - cc65/commitdiff
Added a scope argument to the SymIsDef and SymIsDef functions, so it is
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 22 Nov 2002 01:45:00 +0000 (01:45 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 22 Nov 2002 01:45:00 +0000 (01:45 +0000)
possible to request information for a specific scope.
Add an optional scope argument to the .DEFINED builtin function.
Change the long branch macros to look for symbols in local scope.

git-svn-id: svn://svn.cc65.org/cc65/trunk@1574 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ca65/condasm.c
src/ca65/error.c
src/ca65/error.h
src/ca65/expr.c
src/ca65/macpack.c
src/ca65/main.c
src/ca65/scanner.h
src/ca65/symtab.c
src/ca65/symtab.h

index 5d5b4d79ddc497129b5a7692a3577c11005d4f4a..a270a39a739e3360210cfa6dbb44f0cb1b218881 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2000      Ullrich von Bassewitz                                       */
+/* (C) 2000-2002 Ullrich von Bassewitz                                       */
 /*               Wacholderweg 14                                             */
 /*               D-70597 Stuttgart                                           */
 /* EMail:        uz@musoftware.de                                            */
@@ -307,7 +307,7 @@ void DoConditionals (void)
                    if (Tok != TOK_IDENT) {
                        ErrorSkip (ERR_IDENT_EXPECTED);
                    } else {
-                       SetIfCond (D, SymIsDef (SVal));
+                       SetIfCond (D, SymIsDef (SVal, SCOPE_ANY));
                        NextTok ();
                    }
                }
@@ -346,7 +346,7 @@ void DoConditionals (void)
                    if (Tok != TOK_IDENT) {
                        ErrorSkip (ERR_IDENT_EXPECTED);
                    } else {
-                       SetIfCond (D, !SymIsDef (SVal));
+                       SetIfCond (D, !SymIsDef (SVal, SCOPE_ANY));
                        NextTok ();
                    }
                }
@@ -360,7 +360,7 @@ void DoConditionals (void)
                    if (Tok != TOK_IDENT) {
                        ErrorSkip (ERR_IDENT_EXPECTED);
                    } else {
-                       SetIfCond (D, !SymIsRef (SVal));
+                       SetIfCond (D, !SymIsRef (SVal, SCOPE_ANY));
                        NextTok ();
                    }
                }
@@ -401,7 +401,7 @@ void DoConditionals (void)
                    if (Tok != TOK_IDENT) {
                        ErrorSkip (ERR_IDENT_EXPECTED);
                    } else {
-                       SetIfCond (D, SymIsRef (SVal));
+                       SetIfCond (D, SymIsRef (SVal, SCOPE_ANY));
                        NextTok ();
                    }
                }
index ba4de82697ef3b3ae206b4815a09e851daad71da..2145818aa014e61b162e5a3c6d950996cda4a58c 100644 (file)
@@ -158,9 +158,10 @@ void ErrorMsg (const FilePos* Pos, unsigned ErrNum, va_list ap)
        "Illegal character to start local symbols",
        "Illegal use of local symbol",
        "Illegal segment name: `%s'",
-       "Illegal segment attribute",
+       "Illegal segment attribute",
        "Illegal macro package name",
-       "Illegal emulation feature",
+       "Illegal emulation feature",
+        "Illegal scope specifier",
        "Syntax error",
        "Symbol `%s' is already defined",
        "Undefined symbol `%s'",
index 311b47c2a0047a7ed8c46923fde8b445924d7a37..043931253b5980d8c2b52fb2838d952e8c4d6de1 100644 (file)
@@ -102,6 +102,7 @@ enum Errors {
     ERR_ILLEGAL_SEG_ATTR,
     ERR_ILLEGAL_MACPACK,
     ERR_ILLEGAL_FEATURE,
+    ERR_ILLEGAL_SCOPE,
     ERR_SYNTAX,
     ERR_SYM_ALREADY_DEFINED,
     ERR_SYM_UNDEFINED,
index 497a6143abbece80766303dd70af328eb520dd0f..ce37e9ba7d0edc22a85569037a0683823b41e4f3 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2000 Ullrich von Bassewitz                                       */
+/* (C) 1998-2002 Ullrich von Bassewitz                                       */
 /*               Wacholderweg 14                                             */
 /*               D-70597 Stuttgart                                           */
 /* EMail:        uz@musoftware.de                                            */
@@ -199,18 +199,69 @@ static int FuncConst (void)
 static int FuncDefined (void)
 /* Handle the .DEFINED builtin function */
 {
+    static const char* Keys[] = {
+               "ANY",
+       "GLOBAL",
+        "LOCAL",
+    };
+
+    char Name [sizeof (SVal)];
     int Result = 0;
+    int Scope;
 
+    /* First argument is a symbol name */
     if (Tok != TOK_IDENT) {
        Error (ERR_IDENT_EXPECTED);
        if (Tok != TOK_RPAREN) {
            NextTok ();
        }
+        return 0;
+    }
+
+    /* Remember the name, then skip it */
+    strcpy (Name, SVal);
+    NextTok ();
+
+    /* Comma and scope spec may follow */
+    if (Tok == TOK_COMMA) {
+
+        /* Skip the comma */
+        NextTok ();
+
+        /* An identifier must follow */
+        if (Tok != TOK_IDENT) {
+            Error (ERR_IDENT_EXPECTED);
+            return 0;
+        }
+
+        /* Get the scope, then skip it */
+        Scope = GetSubKey (Keys, sizeof (Keys) / sizeof (Keys [0]));
+        NextTok ();
+
+        /* Check if we got a valid keyword */
+        if (Scope < 0) {
+            Error (ERR_ILLEGAL_SCOPE);
+            return 0;
+        }
+
+        /* Map the scope */
+        switch (Scope) {
+            case 0:     Scope = SCOPE_ANY;    break;
+            case 1:     Scope = SCOPE_GLOBAL; break;
+            case 2:     Scope = SCOPE_LOCAL;  break;
+            default:    Internal ("Invalid scope: %d", Scope);
+        }
+
     } else {
-       Result = SymIsDef (SVal);
-       NextTok ();
+
+        /* Any scope */
+        Scope = SCOPE_ANY;
+
     }
 
+    /* Search for the symbol */
+    Result = SymIsDef (SVal, Scope);
+
     /* Done */
     return Result;
 }
@@ -325,7 +376,7 @@ static int FuncReferenced (void)
            NextTok ();
        }
     } else {
-       Result = SymIsRef (SVal);
+       Result = SymIsRef (SVal, SCOPE_ANY);
        NextTok ();
     }
 
@@ -499,7 +550,7 @@ static ExprNode* Factor (void)
                Error (ERR_IDENT_EXPECTED);
                N = LiteralExpr (0);    /* Dummy */
            } else {
-               S = SymRefGlobal (SVal);
+               S = SymRef (SVal, SCOPE_GLOBAL);
                if (SymIsConst (S)) {
                    /* Use the literal value instead */
                    N = LiteralExpr (GetSymVal (S));
@@ -514,7 +565,7 @@ static ExprNode* Factor (void)
            break;
 
         case TOK_IDENT:
-           S = SymRef (SVal);
+           S = SymRef (SVal, SCOPE_LOCAL);
            if (SymIsConst (S)) {
                /* Use the literal value instead */
                N = LiteralExpr (GetSymVal (S));
index db5c7531f5fe16d317ff2d0066ded82aa53054fd..0d968edba169df393ae314d5f060213eee7a3935 100644 (file)
@@ -75,7 +75,7 @@ static const char MacLongBranch [] =  /* Long branch macros */
     "        .if     .match(Target, 0)\n"
     "        bne     *+5\n"
     "        jmp     Target\n"
-    "        .elseif .def(Target) .and ((*+2)-(Target) <= 127)\n"
+    "        .elseif .def(Target,local) .and ((*+2)-(Target) <= 127)\n"
     "        beq     Target\n"
     "        .else\n"
     "        bne     *+5\n"
@@ -86,7 +86,7 @@ static const char MacLongBranch [] =  /* Long branch macros */
     "        .if     .match(Target, 0)\n"
     "        beq     *+5\n"
     "        jmp     Target\n"
-    "        .elseif .def(Target) .and ((*+2)-(Target) <= 127)\n"
+    "        .elseif .def(Target,local) .and ((*+2)-(Target) <= 127)\n"
     "        bne     Target\n"
     "        .else\n"
     "        beq     *+5\n"
@@ -97,7 +97,7 @@ static const char MacLongBranch [] =  /* Long branch macros */
     "        .if     .match(Target, 0)\n"
     "        bpl     *+5\n"
     "        jmp     Target\n"
-    "        .elseif .def(Target) .and ((*+2)-(Target) <= 127)\n"
+    "        .elseif .def(Target,local) .and ((*+2)-(Target) <= 127)\n"
     "        bmi     Target\n"
     "        .else\n"
     "        bpl     *+5\n"
@@ -108,7 +108,7 @@ static const char MacLongBranch [] =        /* Long branch macros */
     "        .if     .match(Target, 0)\n"
     "        bmi     *+5\n"
     "        jmp     Target\n"
-    "        .elseif .def(Target) .and ((*+2)-(Target) <= 127)\n"
+    "        .elseif .def(Target,local) .and ((*+2)-(Target) <= 127)\n"
     "        bpl     Target\n"
     "        .else\n"
     "        bmi     *+5\n"
@@ -119,7 +119,7 @@ static const char MacLongBranch [] =        /* Long branch macros */
     "        .if     .match(Target, 0)\n"
     "        bcc     *+5\n"
     "        jmp     Target\n"
-    "        .elseif .def(Target) .and ((*+2)-(Target) <= 127)\n"
+    "        .elseif .def(Target,local) .and ((*+2)-(Target) <= 127)\n"
     "        bcs     Target\n"
     "        .else\n"
     "        bcc     *+5\n"
@@ -130,7 +130,7 @@ static const char MacLongBranch [] =        /* Long branch macros */
     "        .if     .match(Target, 0)\n"
     "        bcs     *+5\n"
     "        jmp     Target\n"
-    "        .elseif .def(Target) .and ((*+2)-(Target) <= 127)\n"
+    "        .elseif .def(Target,local) .and ((*+2)-(Target) <= 127)\n"
     "        bcc     Target\n"
     "        .else\n"
     "        bcs     *+5\n"
@@ -141,7 +141,7 @@ static const char MacLongBranch [] =        /* Long branch macros */
     "        .if     .match(Target, 0)\n"
     "        bvc     *+5\n"
     "        jmp     Target\n"
-    "        .elseif .def(Target) .and ((*+2)-(Target) <= 127)\n"
+    "        .elseif .def(Target,local) .and ((*+2)-(Target) <= 127)\n"
     "        bvs     Target\n"
     "        .else\n"
     "        bvc     *+5\n"
@@ -152,7 +152,7 @@ static const char MacLongBranch [] =        /* Long branch macros */
     "        .if     .match(Target, 0)\n"
     "        bvs     *+5\n"
     "        jmp     Target\n"
-    "        .elseif .def(Target) .and ((*+2)-(Target) <= 127)\n"
+    "        .elseif .def(Target,local) .and ((*+2)-(Target) <= 127)\n"
     "        bvc     Target\n"
     "        .else\n"
     "        bvs     *+5\n"
index 6aa28f188b213e5a3e3472d62fbe4ab5da9f704c..5f7f2ca282505b3f1ffac7c1e112343bc286c0b2 100644 (file)
@@ -176,7 +176,7 @@ static void DefineSymbol (const char* Def)
     }
 
     /* Check if have already a symbol with this name */
-    if (SymIsDef (SymName)) {
+    if (SymIsDef (SymName, SCOPE_ANY)) {
        AbEnd ("`%s' is already defined", SymName);
     }
 
index 10a8c4e1d6dd6f6e757bebb53c1eab3a7d89b519..e243970780091027ce47e7fe377e857c532b1276 100644 (file)
@@ -118,7 +118,7 @@ enum Token {
     TOK_BLANK,
     TOK_BSS,
     TOK_BYTE,
-    TOK_CASE,  
+    TOK_CASE,
     TOK_CHARMAP,
     TOK_CODE,
     TOK_CONCAT,
index a8edcad4df921a4a5a74db1e817ec2b599bb2496..b447bc65d49380ed96955246aa5f57a81936d80c 100644 (file)
@@ -360,21 +360,6 @@ static SymEntry* SymFindAny (SymTable* Tab, const char* Name)
 
 
 
-static SymEntry* SymRefInternal (SymTable* Table, const char* Name)
-/* Search for the symbol in the given table and return it */
-{
-    /* Try to find the symbol, create a new one if the symbol does not exist */
-    SymEntry* S = SymFind (Table, Name, SF_ALLOC_NEW);
-
-    /* Mark the symbol as referenced */
-    S->Flags |= SF_REFERENCED;
-
-    /* Return it */
-    return S;
-}
-
-
-
 void SymEnterLevel (void)
 /* Enter a new lexical level */
 {
@@ -451,20 +436,28 @@ void SymDef (const char* Name, ExprNode* Expr, int ZP, int Label)
 
 
 
-SymEntry* SymRef (const char* Name)
+SymEntry* SymRef (const char* Name, int Scope)
 /* Search for the symbol and return it */
-{                                           
-    /* Reference the symbol in the current table */
-    return SymRefInternal (SymTab, Name);
-}
+{
+    SymEntry* S;
 
+    switch (Scope) {
+        case SCOPE_GLOBAL:  S = SymFind (RootTab, Name, SF_ALLOC_NEW);  break;
+        case SCOPE_LOCAL:   S = SymFind (SymTab, Name, SF_ALLOC_NEW);   break;
 
+        /* Others are not allowed */
+        case SCOPE_ANY:
+        default:
+            Internal ("Invalid scope in SymRef: %d", Scope);
+            /* NOTREACHED */
+            S = 0;
+    }
 
-SymEntry* SymRefGlobal (const char* Name)
-/* Search for the symbol in the global namespace and return it */
-{
-    /* Reference the symbol in the current table */
-    return SymRefInternal (RootTab, Name);
+    /* Mark the symbol as referenced */
+    S->Flags |= SF_REFERENCED;
+
+    /* Return it */
+    return S;
 }
 
 
@@ -639,19 +632,39 @@ void SymConDes (const char* Name, unsigned Type, unsigned Prio)
 
 
 
-int SymIsDef (const char* Name)
+int SymIsDef (const char* Name, int Scope)
 /* Return true if the given symbol is already defined */
 {
-    SymEntry* S = SymFindAny (SymTab, Name);
+    SymEntry* S = 0;
+
+    /* Search for the symbol */
+    switch (Scope) {
+        case SCOPE_ANY:    S = SymFindAny (SymTab, Name);                 break;
+        case SCOPE_GLOBAL: S = SymFind (RootTab, Name, SF_FIND_EXISTING); break;
+        case SCOPE_LOCAL:  S = SymFind (SymTab, Name, SF_FIND_EXISTING);  break;
+        default:           Internal ("Invalid scope in SymIsDef: %d", Scope);
+    }
+
+    /* Check if it's defined */
     return S != 0 && (S->Flags & SF_DEFINED) != 0;
 }
 
 
 
-int SymIsRef (const char* Name)
+int SymIsRef (const char* Name, int Scope)
 /* Return true if the given symbol has been referenced */
 {
-    SymEntry* S = SymFindAny (SymTab, Name);
+    SymEntry* S = 0;
+
+    /* Search for the symbol */
+    switch (Scope) {
+        case SCOPE_ANY:    S = SymFindAny (SymTab, Name);                 break;
+        case SCOPE_GLOBAL: S = SymFind (RootTab, Name, SF_FIND_EXISTING); break;
+        case SCOPE_LOCAL:  S = SymFind (SymTab, Name, SF_FIND_EXISTING);  break;
+        default:           Internal ("Invalid scope in SymIsRef: %d", Scope);
+    }
+
+    /* Check if it's defined */
     return S != 0 && (S->Flags & SF_REFERENCED) != 0;
 }
 
index 642734274017754e5821dc7579fd2faa397c6c71..e1d8e39ff0381b76fa6a750188ab4ba98574c148 100644 (file)
 
 
 
+/*****************************************************************************/
+/*                                  Data                                    */
+/*****************************************************************************/
+
+
+
+/* Scope identifiers */
+#define SCOPE_ANY       0
+#define SCOPE_GLOBAL    1
+#define SCOPE_LOCAL     2
+
+
+
 /*****************************************************************************/
 /*                                  Code                                    */
 /*****************************************************************************/
@@ -63,16 +76,13 @@ void SymLeaveLevel (void);
 void SymDef (const char* Name, ExprNode* Expr, int ZP, int Label);
 /* Define a new symbol */
 
-SymEntry* SymRef (const char* Name);
+SymEntry* SymRef (const char* Name, int Scope);
 /* Search for the symbol and return it */
 
-SymEntry* SymRefGlobal (const char* Name);
-/* Search for the symbol in the global namespace and return it */
-
-int SymIsDef (const char* Name);
+int SymIsDef (const char* Name, int Scope);
 /* Return true if the given symbol is already defined */
 
-int SymIsRef (const char* Name);
+int SymIsRef (const char* Name, int Scope);
 /* Return true if the given symbol has been referenced */
 
 void SymImport (const char* Name, int ZP);