]> git.sur5r.net Git - cc65/blobdiff - src/ca65/main.c
Finished implemenation of commands to delete macros. Added the new commands to
[cc65] / src / ca65 / main.c
index eae7c384f1278601cc3cb42d09c1d7661928c7b0..b51c88b76abcace833ef2c5cdaefba1521bd9073 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2010, Ullrich von Bassewitz                                      */
+/* (C) 1998-2011, Ullrich von Bassewitz                                      */
 /*                Roemerstrasse 52                                           */
 /*                D-70794 Filderstadt                                        */
 /* EMail:         uz@cc65.org                                                */
@@ -97,7 +97,7 @@ static void Usage (void)
             "  -g\t\t\t\tAdd debug info to object file\n"
             "  -h\t\t\t\tHelp (this text)\n"
             "  -i\t\t\t\tIgnore case of symbols\n"
-            "  -l\t\t\t\tCreate a listing if assembly was ok\n"
+            "  -l name\t\t\tCreate a listing file if assembly was ok\n"
             "  -mm model\t\t\tSet the memory model\n"
             "  -o name\t\t\tName the output file\n"
             "  -s\t\t\t\tEnable smart mode\n"
@@ -116,7 +116,7 @@ static void Usage (void)
             "  --help\t\t\tHelp (this text)\n"
             "  --ignore-case\t\t\tIgnore case of symbols\n"
             "  --include-dir dir\t\tSet an include directory search path\n"
-            "  --listing\t\t\tCreate a listing if assembly was ok\n"
+            "  --listing name\t\tCreate a listing file if assembly was ok\n"
             "  --list-bytes n\t\tMaximum number of bytes per listing line\n"
             "  --macpack-dir dir\t\tSet a macro package directory\n"
             "  --memory-model model\t\tSet the memory model\n"
@@ -388,7 +388,7 @@ static void OptCreateDep (const char* Opt, const char* Arg)
 
 
 static void OptCreateFullDep (const char* Opt attribute ((unused)),
-                             const char* Arg)
+                             const char* Arg)
 /* Handle the --create-full-dep option */
 {
     FileNameOption (Opt, Arg, &FullDepName);
@@ -477,11 +477,19 @@ static void OptListBytes (const char* Opt, const char* Arg)
 
 
 
-static void OptListing (const char* Opt attribute ((unused)),
-                       const char* Arg attribute ((unused)))
+static void OptListing (const char* Opt, const char* Arg)
 /* Create a listing file */
-{
-    Listing = 1;
+{              
+    /* Since the meaning of -l and --listing has changed, print an error if
+     * the filename is empty or begins with the option char.
+     */
+    if (Arg == 0 || *Arg == '\0' || *Arg == '-') {
+        Fatal ("The meaning of `%s' has changed. It does now "
+               "expect a file name as argument.", Opt);
+    }
+
+    /* Get the file name */
+    FileNameOption (Opt, Arg, &ListingName);
 }
 
 
@@ -598,7 +606,7 @@ static void OneLine (void)
                InitListingLine ();
     }
 
-    if (Tok == TOK_COLON) {
+    if (CurTok.Tok == TOK_COLON) {
                /* An unnamed label */
                ULabDef ();
                NextTok ();
@@ -607,16 +615,16 @@ static void OneLine (void)
     /* If the first token on the line is an identifier, check for a macro or
      * an instruction.
      */
-    if (Tok == TOK_IDENT) {
+    if (CurTok.Tok == TOK_IDENT) {
         if (!UbiquitousIdents) {
             /* Macros and symbols cannot use instruction names */
-            Instr = FindInstruction (&SVal);
+            Instr = FindInstruction (&CurTok.SVal);
             if (Instr < 0) {
-                Macro = IsMacro (&SVal);
+                Macro = IsMacro (&CurTok.SVal);
             }
         } else {
             /* Macros and symbols may use the names of instructions */
-            Macro = IsMacro (&SVal);
+            Macro = IsMacro (&CurTok.SVal);
         }
     }
 
@@ -624,12 +632,12 @@ static void OneLine (void)
      * scoped identifier which may start with a namespace token (for global
      * namespace)
      */
-    if (Tok == TOK_LOCAL_IDENT ||
-        Tok == TOK_NAMESPACE   ||
-        (Tok == TOK_IDENT && Instr < 0 && !Macro)) {
+    if (CurTok.Tok == TOK_LOCAL_IDENT ||
+        CurTok.Tok == TOK_NAMESPACE   ||
+        (CurTok.Tok == TOK_IDENT && Instr < 0 && !Macro)) {
 
         /* Did we have whitespace before the ident? */
-        int HadWS = WS;
+        int HadWS = CurTok.WS;
 
         /* Generate the symbol table entry, then skip the name */
         Sym = ParseAnySymName (SYM_ALLOC_NEW);
@@ -637,10 +645,10 @@ static void OneLine (void)
         /* If a colon follows, this is a label definition. If there
          * is no colon, it's an assignment.
          */
-        if (Tok == TOK_EQ || Tok == TOK_ASSIGN) {
+        if (CurTok.Tok == TOK_EQ || CurTok.Tok == TOK_ASSIGN) {
 
             /* Determine the symbol flags from the assignment token */
-            unsigned Flags = (Tok == TOK_ASSIGN)? SF_LABEL : SF_NONE;
+            unsigned Flags = (CurTok.Tok == TOK_ASSIGN)? SF_LABEL : SF_NONE;
 
             /* Skip the '=' */
             NextTok ();
@@ -652,7 +660,7 @@ static void OneLine (void)
             ConsumeSep ();
             return;
 
-        } else if (Tok == TOK_SET) {
+        } else if (CurTok.Tok == TOK_SET) {
 
             ExprNode* Expr;
 
@@ -686,11 +694,11 @@ static void OneLine (void)
              * without a colon if there is no whitespace before the
              * identifier.
              */
-            if (Tok != TOK_COLON) {
+            if (CurTok.Tok != TOK_COLON) {
                 if (HadWS || !NoColonLabels) {
                     Error ("`:' expected");
                     /* Try some smart error recovery */
-                    if (Tok == TOK_NAMESPACE) {
+                    if (CurTok.Tok == TOK_NAMESPACE) {
                         NextTok ();
                     }
                 }
@@ -702,35 +710,35 @@ static void OneLine (void)
             /* If we come here, a new identifier may be waiting, which may
              * be a macro or instruction.
              */
-            if (Tok == TOK_IDENT) {
+            if (CurTok.Tok == TOK_IDENT) {
                 if (!UbiquitousIdents) {
                     /* Macros and symbols cannot use instruction names */
-                    Instr = FindInstruction (&SVal);
+                    Instr = FindInstruction (&CurTok.SVal);
                     if (Instr < 0) {
-                        Macro = IsMacro (&SVal);
+                        Macro = IsMacro (&CurTok.SVal);
                     }
                 } else {
                     /* Macros and symbols may use the names of instructions */
-                    Macro = IsMacro (&SVal);
+                    Macro = IsMacro (&CurTok.SVal);
                 }
             }
         }
     }
 
     /* We've handled a possible label, now handle the remainder of the line */
-    if (Tok >= TOK_FIRSTPSEUDO && Tok <= TOK_LASTPSEUDO) {
+    if (CurTok.Tok >= TOK_FIRSTPSEUDO && CurTok.Tok <= TOK_LASTPSEUDO) {
         /* A control command */
         HandlePseudo ();
     } else if (Macro) {
         /* A macro expansion */
         MacExpandStart ();
     } else if (Instr >= 0 ||
-               (UbiquitousIdents && ((Instr = FindInstruction (&SVal)) >= 0))) {
+               (UbiquitousIdents && ((Instr = FindInstruction (&CurTok.SVal)) >= 0))) {
         /* A mnemonic - assemble one instruction */
         HandleInstruction (Instr);
-    } else if (PCAssignment && (Tok == TOK_STAR || Tok == TOK_PC)) {
+    } else if (PCAssignment && (CurTok.Tok == TOK_STAR || CurTok.Tok == TOK_PC)) {
         NextTok ();
-        if (Tok != TOK_EQ) {
+        if (CurTok.Tok != TOK_EQ) {
             Error ("`=' expected");
             SkipUntilSep ();
         } else {
@@ -770,7 +778,7 @@ static void Assemble (void)
     NextTok ();
 
     /* Assemble lines until end of file */
-    while (Tok != TOK_EOF) {
+    while (CurTok.Tok != TOK_EOF) {
        OneLine ();
     }
 }
@@ -798,11 +806,14 @@ static void CreateObjFile (void)
     /* Write the export list */
     WriteExports ();
 
+    /* Write the scopes if requested */
+    WriteScopes ();
+
     /* Write debug symbols if requested */
     WriteDbgSyms ();
 
     /* Write line infos if requested */
-    WriteLineInfo ();
+    WriteLineInfos ();
 
     /* Write the string pool */
     WriteStrPool ();
@@ -833,7 +844,7 @@ int main (int argc, char* argv [])
        { "--ignore-case",      0,      OptIgnoreCase           },
        { "--include-dir",      1,      OptIncludeDir           },
         { "--list-bytes",       1,      OptListBytes            },
-       { "--listing",          0,      OptListing              },
+       { "--listing",          1,      OptListing              },
         { "--macpack-dir",      1,      OptMacPackDir           },
         { "--memory-model",     1,      OptMemoryModel          },
        { "--pagelength",       1,      OptPageLength           },
@@ -859,6 +870,11 @@ int main (int argc, char* argv [])
      */
     SymEnterLevel (&GlobalNameSpace, ST_GLOBAL, ADDR_SIZE_DEFAULT);
 
+    /* Initialize the line infos. Must be done here, since we need line infos
+     * for symbol definitions.
+     */
+    InitLineInfo ();
+
     /* Check the parameters */
     I = 1;
     while (I < ArgCount) {
@@ -887,7 +903,7 @@ int main (int argc, char* argv [])
                            break;
 
                        case 'l':
-                   OptListing (Arg, 0);
+                   OptListing (Arg, GetArg (&I, 2));
                            break;
 
                 case 'm':
@@ -899,7 +915,7 @@ int main (int argc, char* argv [])
                     break;
 
                        case 'o':
-                           OutFile = GetArg (&I, 2);
+                           OutFile = GetArg (&I, 2);
                            break;
 
                        case 's':
@@ -923,7 +939,7 @@ int main (int argc, char* argv [])
                    break;
 
                        case 'U':
-                   OptAutoImport (Arg, 0);
+                   OptAutoImport (Arg, 0);
                            break;
 
                        case 'V':
@@ -1025,7 +1041,7 @@ int main (int argc, char* argv [])
      */
     if (ErrorCount == 0) {
        CreateObjFile ();
-       if (Listing) {
+       if (SB_GetLen (&ListingName) > 0) {
            CreateListing ();
        }
        CreateDependencies ();