mirror of
https://github.com/cc65/cc65.git
synced 2024-06-29 10:29:30 +00:00
30f88d2646
git-svn-id: svn://svn.cc65.org/cc65/trunk@3908 b7a2c559-68d2-44c3-8de9-860c34a00d81
174 lines
5.8 KiB
C
174 lines
5.8 KiB
C
/*****************************************************************************/
|
|
/* */
|
|
/* macpack.c */
|
|
/* */
|
|
/* Predefined macro packages for the ca65 macroassembler */
|
|
/* */
|
|
/* */
|
|
/* */
|
|
/* (C) 1998-2008, Ullrich von Bassewitz */
|
|
/* Roemerstrasse 52 */
|
|
/* D-70794 Filderstadt */
|
|
/* EMail: uz@cc65.org */
|
|
/* */
|
|
/* */
|
|
/* This software is provided 'as-is', without any expressed or implied */
|
|
/* warranty. In no event will the authors be held liable for any damages */
|
|
/* arising from the use of this software. */
|
|
/* */
|
|
/* Permission is granted to anyone to use this software for any purpose, */
|
|
/* including commercial applications, and to alter it and redistribute it */
|
|
/* freely, subject to the following restrictions: */
|
|
/* */
|
|
/* 1. The origin of this software must not be misrepresented; you must not */
|
|
/* claim that you wrote the original software. If you use this software */
|
|
/* in a product, an acknowledgment in the product documentation would be */
|
|
/* appreciated but is not required. */
|
|
/* 2. Altered source versions must be plainly marked as such, and must not */
|
|
/* be misrepresented as being the original software. */
|
|
/* 3. This notice may not be removed or altered from any source */
|
|
/* distribution. */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
/* common */
|
|
#include "check.h"
|
|
#include "strbuf.h"
|
|
#include "strutil.h"
|
|
|
|
/* ca65 */
|
|
#include "error.h"
|
|
#include "scanner.h"
|
|
#include "macpack.h"
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* Data */
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
/* Predefined macro packages converted into C strings by a perl script */
|
|
#include "atari.inc"
|
|
#include "cbm.inc"
|
|
#include "cpu.inc"
|
|
#include "generic.inc"
|
|
#include "longbranch.inc"
|
|
|
|
/* Table with pointers to the different packages */
|
|
static struct {
|
|
const char* Name;
|
|
char* Package;
|
|
} MacPackages[MAC_COUNT] = {
|
|
/* Packages sorted by id */
|
|
{ "atari", MacAtari },
|
|
{ "cbm", MacCBM },
|
|
{ "cpu", MacCPU },
|
|
{ "generic", MacGeneric },
|
|
{ "longbranch", MacLongBranch },
|
|
};
|
|
|
|
/* Directory that contains standard macro package files */
|
|
static StrBuf MacPackDir = STATIC_STRBUF_INITIALIZER;
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* Code */
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
int MacPackFind (const StrBuf* 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 (SB_CompareStr (Name, MacPackages[I].Name) == 0) {
|
|
/* Found */
|
|
return I;
|
|
}
|
|
}
|
|
|
|
/* Not found */
|
|
return -1;
|
|
}
|
|
|
|
|
|
|
|
int MacPackInsert (int Id)
|
|
/* Insert the macro package with the given id in the input stream. Returns
|
|
* true if the macro package was found and successfully inserted. Returns
|
|
* false otherwise.
|
|
*/
|
|
{
|
|
int RetCode;
|
|
|
|
/* Check the parameter */
|
|
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);
|
|
|
|
/* Always successful */
|
|
RetCode = 1;
|
|
|
|
} 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 */
|
|
RetCode = NewInputFile (SB_GetConstBuf (&Filename));
|
|
|
|
/* Destroy the contents of Filename */
|
|
SB_Done (&Filename);
|
|
|
|
}
|
|
|
|
/* Return the success code */
|
|
return RetCode;
|
|
}
|
|
|
|
|
|
|
|
void MacPackSetDir (const StrBuf* 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_Copy (&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);
|
|
}
|
|
|
|
|
|
|