]> git.sur5r.net Git - cc65/commitdiff
Added a new option --macpack-dir that allows to load the macro packages
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Wed, 24 Aug 2005 20:05:08 +0000 (20:05 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Wed, 24 Aug 2005 20:05:08 +0000 (20:05 +0000)
from files instead of using the builtin ones.

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

src/ca65/global.c
src/ca65/macpack.c
src/ca65/macpack.h
src/ca65/main.c
src/ca65/pseudo.c

index e0196226aa05553668ed14e6e1b5022d67ae4c0b..2449ce44e8dab582502075695d4abcda398291fd 100644 (file)
@@ -78,7 +78,7 @@ unsigned char MissingCharTerm    = 0;   /* Allow lda #'a (no closing term) */
 unsigned char UbiquitousIdents   = 0;   /* Allow ubiquitous identifiers */
 
 /* Misc stuff */
-const char Copyright[]           = "(C) Copyright 1998-2004 Ullrich von Bassewitz";
+const char Copyright[]           = "(C) Copyright 1998-2005 Ullrich von Bassewitz";
 
 
 
index f9c77c612f640e8ae24dae443f19b9218bab9068..6cf5c09d32c49a5e39d21dc6b27ca7a40bfcb362 100644 (file)
@@ -35,6 +35,8 @@
 
 /* common */
 #include "check.h"
+#include "strbuf.h"
+#include "strutil.h"
 
 /* ca65 */
 #include "error.h"
 #include "longbranch.inc"
 
 /* Table with pointers to the different packages */
-static char* MacPackages [] = {
-    MacGeneric,
-    MacLongBranch,
-    MacCBM,
-    MacCPU
+static struct {
+    const char* Name;
+    char*       Package;
+} MacPackages[MAC_COUNT] = {
+    /* Packages sorted by id */
+    { "cbm",            MacCBM          },
+    { "cpu",            MacCPU          },
+    { "generic",        MacGeneric      },
+    { "longbranch",     MacLongBranch   },
 };
 
+/* Directory that contains standard macro package files */
+static StrBuf MacPackDir = STATIC_STRBUF_INITIALIZER;
+
 
 
 /*****************************************************************************/
@@ -71,14 +80,80 @@ static char* MacPackages [] = {
 
 
 
-void InsertMacPack (unsigned Id)
+int MacPackFind (const char* Name)
+/* Find a macro package by name. The function will either return the id or
+ * -1 if the package name was not found.
+ */
+{
+    int I;
+
+    for (I = 0; I < MAC_COUNT; ++I) {
+        if (StrCaseCmp (Name, MacPackages[I].Name) == 0) {
+            /* Found */
+            return I;
+        }
+    }
+
+    /* Not found */
+    return -1;
+}
+
+
+
+void MacPackInsert (int Id)
 /* Insert the macro package with the given id in the input stream */
 {
     /* Check the parameter */
-    CHECK (Id < sizeof (MacPackages) / sizeof (MacPackages [0]));
+    CHECK (Id >= 0 && Id < MAC_COUNT);
+
+    /* If we have a macro package directory given, load a file from the
+     * directory, otherwise use the builtin stuff.
+     */
+    if (SB_IsEmpty (&MacPackDir)) {
+
+        /* Insert the builtin package */
+        NewInputData (MacPackages[Id].Package, 0);
 
-    /* Insert the package */ 
-    NewInputData (MacPackages[Id], 0);
+    } else {
+
+        StrBuf Filename = AUTO_STRBUF_INITIALIZER;
+
+        /* Build the complete file name */
+        SB_Copy (&Filename, &MacPackDir);
+        SB_AppendStr (&Filename, MacPackages[Id].Name);
+        SB_AppendStr (&Filename, ".mac");
+        SB_Terminate (&Filename);
+
+        /* Open the macro package as include file */
+        NewInputFile (SB_GetConstBuf (&Filename));
+
+        /* Destroy the contents of Filename */
+        DoneStrBuf (&Filename);
+
+    }
+}
+
+
+
+void MacPackSetDir (const char* Dir)
+/* Set a directory where files for macro packages can be found. Standard is
+ * to use the builtin packages. For debugging macro packages, external files
+ * can be used.
+ */
+{
+    /* Copy the directory name to the buffer */
+    SB_CopyStr (&MacPackDir, Dir);
+
+    /* Make sure that the last character is a path delimiter */
+    if (SB_NotEmpty (&MacPackDir)) {
+        char C = SB_LookAtLast (&MacPackDir);
+        if (C != '\\' && C != '/') {
+            SB_AppendChar (&MacPackDir, '/');
+        }
+    }
+
+    /* Terminate the buffer so it's usable as a C string */
+    SB_Terminate (&MacPackDir);
 }
 
 
index d46ee9ddafcf2b1b449d58ae44128220335f8faa..75ca43b5c12608b9b2e4de95bfe1d28a442c49b5 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2003 Ullrich von Bassewitz                                       */
-/*               Römerstrasse 52                                             */
-/*               D-70794 Filderstadt                                         */
-/* EMail:        uz@cc65.org                                                 */
+/* (C) 1998-2005, Ullrich von Bassewitz                                      */
+/*                Römerstrasse 52                                            */
+/*                D-70794 Filderstadt                                        */
+/* EMail:         uz@cc65.org                                                */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
 
 
 /* Constants for the predefined packages */
-#define MAC_GENERIC            0
-#define        MAC_LONGBRANCH          1
-#define MAC_CBM                 2
-#define MAC_CPU                 3
+enum {
+    MAC_CBM,
+    MAC_CPU,
+    MAC_GENERIC,
+    MAC_LONGBRANCH,
+
+    /* Number of known packages */
+    MAC_COUNT
+};
 
 
 
 
 
 
-void InsertMacPack (unsigned Id);
+int MacPackFind (const char* Name);
+/* Find a macro package by name. The function will either return the id or
+ * -1 if the package name was not found.
+ */
+
+void MacPackInsert (int Id);
 /* Insert the macro package with the given id in the input stream */
 
+void MacPackSetDir (const char* Dir);
+/* Set a directory where files for macro packages can be found. Standard is
+ * to use the builtin packages. For debugging macro packages, external files
+ * can be used.
+ */
+
 
 
 /* End of macpack.h */
index 42b2891b0486b5b900a2faa1328c2722d923e711..1ccef1fc4a44267670bf7dfe7063fbeb9e4d5ff0 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2004 Ullrich von Bassewitz                                       */
-/*               Römerstraße 52                                              */
-/*               D-70794 Filderstadt                                         */
-/* EMail:        uz@cc65.org                                                 */
+/* (C) 1998-2005, Ullrich von Bassewitz                                      */
+/*                Römerstraße 52                                             */
+/*                D-70794 Filderstadt                                        */
+/* EMail:         uz@cc65.org                                                */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
@@ -61,6 +61,7 @@
 #include "istack.h"
 #include "lineinfo.h"
 #include "listing.h"
+#include "macpack.h"
 #include "macro.h"
 #include "nexttok.h"
 #include "objfile.h"
@@ -111,6 +112,7 @@ static void Usage (void)
             "  --include-dir dir\tSet an include directory search path\n"
             "  --listing\t\tCreate a listing if assembly was ok\n"
             "  --list-bytes n\tMaximum number of bytes per listing line\n"
+            "  --macpack-dir dir\tSet a macro package directory\n"
             "  --memory-model model\tSet the memory model\n"
             "  --pagelength n\tSet the page length for the listing\n"
             "  --smart\t\tEnable smart mode\n"
@@ -420,6 +422,15 @@ static void OptListing (const char* Opt attribute ((unused)),
 
 
 
+static void OptMacPackDir (const char* Opt attribute ((unused)), const char* Arg)
+/* Set a macro package directory */
+{
+    /* Use the directory */
+    MacPackSetDir (Arg);
+}
+
+
+
 static void OptMemoryModel (const char* Opt, const char* Arg)
 /* Set the memory model */
 {
@@ -754,6 +765,7 @@ int main (int argc, char* argv [])
        { "--include-dir",      1,      OptIncludeDir           },
         { "--list-bytes",       1,      OptListBytes            },
        { "--listing",          0,      OptListing              },
+        { "--macpack-dir",      1,      OptMacPackDir           },
         { "--memory-model",     1,      OptMemoryModel          },
        { "--pagelength",       1,      OptPageLength           },
        { "--smart",            0,      OptSmart                },
index 1eed86f94a30076ed713cee33f42a069009a902e..cfd5592e9073b7e809355ac80e2afda94eeeac1f 100644 (file)
@@ -1206,14 +1206,6 @@ static void DoLocalChar (void)
 static void DoMacPack (void)
 /* Insert a macro package */
 {
-    /* Macro package names */
-    static const char* Keys [] = {
-       "GENERIC",
-               "LONGBRANCH",
-        "CBM",
-        "CPU"
-    };
-
     int Package;
 
     /* We expect an identifier */
@@ -1222,8 +1214,8 @@ static void DoMacPack (void)
        return;
     }
 
-    /* Map the keyword to a number */
-    Package = GetSubKey (Keys, sizeof (Keys) / sizeof (Keys [0]));
+    /* Search for the macro package name */
+    Package = MacPackFind (SVal);
     if (Package < 0) {
        /* Not found */
        ErrorSkip ("Invalid macro package");
@@ -1234,7 +1226,7 @@ static void DoMacPack (void)
     NextTok ();
 
     /* Insert the package */
-    InsertMacPack (Package);
+    MacPackInsert (Package);
 }