1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-27 00:29:31 +00:00

Separated the emulation features in a module.

Add a new command line option --feature that allows to set emulation
features from the command line.


git-svn-id: svn://svn.cc65.org/cc65/trunk@311 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz 2000-09-02 11:35:22 +00:00
parent f55d0ccee1
commit 6288682343
8 changed files with 248 additions and 35 deletions

114
src/ca65/feature.c Normal file
View File

@ -0,0 +1,114 @@
/*****************************************************************************/
/* */
/* feature.c */
/* */
/* Subroutines for the emulation features */
/* */
/* */
/* */
/* (C) 2000 Ullrich von Bassewitz */
/* Wacholderweg 14 */
/* D-70597 Stuttgart */
/* EMail: uz@musoftware.de */
/* */
/* */
/* 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. */
/* */
/*****************************************************************************/
#include <string.h>
/* ca65 */
#include "global.h"
#include "feature.h"
/*****************************************************************************/
/* Data */
/*****************************************************************************/
/* Names of the features */
static const char* FeatureKeys[FEAT_COUNT] = {
"dollar_is_pc",
"labels_without_colons",
"loose_string_term",
"at_in_identifiers",
"dollar_in_identifiers",
"pc_assignment",
};
/*****************************************************************************/
/* Code */
/*****************************************************************************/
feature_t FindFeature (const char* Key)
/* Find the feature in a table and return the corresponding enum value. If the
* feature is invalid, return FEAT_UNKNOWN.
*/
{
feature_t F;
/* This is not time critical, so do a linear search */
for (F = (feature_t) 0; F < FEAT_COUNT; ++F) {
if (strcmp (Key, FeatureKeys[F]) == 0) {
/* Found, index is enum value */
return F;
}
}
/* Not found */
return FEAT_UNKNOWN;
}
feature_t SetFeature (const char* Key)
/* Find the feature and set the corresponding flag if the feature is known.
* In any case, return the feature found. An invalid Key will return
* FEAT_UNKNOWN.
*/
{
/* Map the string to an enum value */
feature_t Feature = FindFeature (Key);
/* Set the flags */
switch (Feature) {
case FEAT_DOLLAR_IS_PC: DollarIsPC = 1; break;
case FEAT_LABELS_WITHOUT_COLONS: NoColonLabels = 1; break;
case FEAT_LOOSE_STRING_TERM: LooseStringTerm= 1; break;
case FEAT_AT_IN_IDENTIFIERS: AtInIdents = 1; break;
case FEAT_DOLLAR_IN_IDENTIFIERS: DollarInIdents = 1; break;
case FEAT_PC_ASSIGNMENT: PCAssignment = 1; break;
default: /* Keep gcc silent */ break;
}
/* Return the value found */
return Feature;
}

86
src/ca65/feature.h Normal file
View File

@ -0,0 +1,86 @@
/*****************************************************************************/
/* */
/* feature.h */
/* */
/* Subroutines for the emulation features */
/* */
/* */
/* */
/* (C) 2000 Ullrich von Bassewitz */
/* Wacholderweg 14 */
/* D-70597 Stuttgart */
/* EMail: uz@musoftware.de */
/* */
/* */
/* 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. */
/* */
/*****************************************************************************/
#ifndef FEATURE_H
#define FEATURE_H
/*****************************************************************************/
/* Data */
/*****************************************************************************/
typedef enum {
FEAT_UNKNOWN = -1,
FEAT_DOLLAR_IS_PC,
FEAT_LABELS_WITHOUT_COLONS,
FEAT_LOOSE_STRING_TERM,
FEAT_AT_IN_IDENTIFIERS,
FEAT_DOLLAR_IN_IDENTIFIERS,
FEAT_PC_ASSIGNMENT,
/* Special value: Number of features available */
FEAT_COUNT
} feature_t;
/*****************************************************************************/
/* Code */
/*****************************************************************************/
feature_t FindFeature (const char* Key);
/* Find the feature in a table and return the corresponding enum value. If the
* feature is invalid, return FEAT_UNKNOWN.
*/
feature_t SetFeature (const char* Key);
/* Find the feature and set the corresponding flag if the feature is known.
* In any case, return the feature found. An invalid Key will return
* FEAT_UNKNOWN.
*/
/* End of feature.h */
#endif

View File

@ -48,6 +48,7 @@
#include "abend.h"
#include "error.h"
#include "expr.h"
#include "feature.h"
#include "filetab.h"
#include "global.h"
#include "incpath.h"
@ -96,6 +97,7 @@ static void Usage (void)
" --auto-import\t\tMark unresolved symbols as import\n"
" --cpu type\t\tSet cpu type\n"
" --debug-info\t\tAdd debug info to object file\n"
" --feature name\tSet an emulation feature\n"
" --help\t\tHelp (this text)\n"
" --ignore-case\t\tIgnore case of symbols\n"
" --include-dir dir\tSet an include directory search path\n"
@ -220,6 +222,17 @@ static void OptDebugInfo (const char* Opt, const char* Arg)
static void OptFeature (const char* Opt, const char* Arg)
/* Set an emulation feature */
{
/* Set the feature, check for errors */
if (SetFeature (Arg) == FEAT_UNKNOWN) {
AbEnd ("Illegal emulation feature: `%s'", Arg);
}
}
static void OptHelp (const char* Opt, const char* Arg)
/* Print usage information and exit */
{
@ -479,15 +492,16 @@ int main (int argc, char* argv [])
{ "--auto-import", 0, OptAutoImport },
{ "--cpu", 1, OptCPU },
{ "--debug-info", 0, OptDebugInfo },
{ "--help", 0, OptHelp },
{ "--feature", 1, OptFeature },
{ "--help", 0, OptHelp },
{ "--ignore-case", 0, OptIgnoreCase },
{ "--include-dir", 1, OptIncludeDir },
{ "--listing", 0, OptListing },
{ "--listing", 0, OptListing },
{ "--pagelength", 1, OptPageLength },
{ "--smart", 0, OptSmart },
{ "--target", 1, OptTarget },
{ "--verbose", 0, OptVerbose },
{ "--version", 0, OptVersion },
{ "--smart", 0, OptSmart },
{ "--target", 1, OptTarget },
{ "--verbose", 0, OptVerbose },
{ "--version", 0, OptVersion },
};
int I;

View File

@ -14,6 +14,7 @@ OBJS = condasm.o \
ea.o \
error.o \
expr.o \
feature.o \
filetab.o \
fragment.o \
global.o \

View File

@ -72,6 +72,7 @@ OBJS = condasm.obj \
ea.obj \
error.obj \
expr.obj \
feature.obj \
filetab.obj \
fragment.obj \
global.obj \
@ -118,6 +119,7 @@ FILE dbginfo.obj
FILE ea.obj
FILE error.obj
FILE expr.obj
FILE feature.obj
FILE filetab.obj
FILE fragment.obj
FILE global.obj

View File

@ -49,6 +49,7 @@
#include "dbginfo.h"
#include "error.h"
#include "expr.h"
#include "feature.h"
#include "global.h"
#include "instr.h"
#include "listing.h"
@ -511,17 +512,6 @@ static void DoFarAddr (void)
static void DoFeature (void)
/* Switch the Feature option */
{
int Feature;
static const char* Keys[] = {
"DOLLAR_IS_PC",
"LABELS_WITHOUT_COLONS",
"LOOSE_STRING_TERM",
"AT_IN_IDENTIFIERS",
"DOLLAR_IN_IDENTIFIERS",
"PC_ASSIGNMENT",
};
/* Allow a list of comma separated keywords */
while (1) {
@ -531,27 +521,18 @@ static void DoFeature (void)
return;
}
/* Map the keyword to a number */
Feature = GetSubKey (Keys, sizeof (Keys) / sizeof (Keys [0]));
if (Feature < 0) {
/* Make the string attribute lower case */
LocaseSVal ();
/* Set the feature and check for errors */
if (SetFeature (SVal) == FEAT_UNKNOWN) {
/* Not found */
ErrorSkip (ERR_ILLEGAL_FEATURE);
return;
}
/* Skip the keyword */
NextTok ();
/* Switch the feature on */
switch (Feature) {
case 0: DollarIsPC = 1; break;
case 1: NoColonLabels = 1; break;
case 2: LooseStringTerm = 1; break;
case 3: AtInIdents = 1; break;
case 4: DollarInIdents = 1; break;
case 5: PCAssignment = 1; break;
default: Internal ("Invalid feature: %d", Feature);
}
} else {
/* Skip the keyword */
NextTok ();
}
/* Allow more than one keyword */
if (Tok == TOK_COMMA) {

View File

@ -493,6 +493,18 @@ static void NextChar (void)
void LocaseSVal (void)
/* Make SVal lower case */
{
unsigned I = 0;
while (SVal [I]) {
SVal [I] = tolower (SVal [I]);
++I;
}
}
void UpcaseSVal (void)
/* Make SVal upper case */
{

View File

@ -236,6 +236,9 @@ void DoneInputFile (void);
void NewInputData (const char* Data, int Malloced);
/* Add a chunk of input data to the input stream */
void LocaseSVal (void);
/* Make SVal lower case */
void UpcaseSVal (void);
/* Make SVal upper case */