--- /dev/null
+/*****************************************************************************/
+/* */
+/* 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;
+}
+
+
+
--- /dev/null
+/*****************************************************************************/
+/* */
+/* 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
+
+
+
#include "abend.h"
#include "error.h"
#include "expr.h"
+#include "feature.h"
#include "filetab.h"
#include "global.h"
#include "incpath.h"
" --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"
+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 */
{
{ "--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;
ea.o \
error.o \
expr.o \
+ feature.o \
filetab.o \
fragment.o \
global.o \
ea.obj \
error.obj \
expr.obj \
+ feature.obj \
filetab.obj \
fragment.obj \
global.obj \
FILE ea.obj
FILE error.obj
FILE expr.obj
+FILE feature.obj
FILE filetab.obj
FILE fragment.obj
FILE global.obj
#include "dbginfo.h"
#include "error.h"
#include "expr.h"
+#include "feature.h"
#include "global.h"
#include "instr.h"
#include "listing.h"
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) {
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) {
+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 */
{
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 */