/* */
/* */
/* */
-/* (C) 1998-2008 Ullrich von Bassewitz */
-/* Roemerstrasse 52 */
-/* D-70794 Filderstadt */
-/* EMail: uz@cc65.org */
+/* (C) 1998-2010, Ullrich von Bassewitz */
+/* Roemerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
{ ".ASSERT", TOK_ASSERT },
{ ".AUTOIMPORT", TOK_AUTOIMPORT },
{ ".BANKBYTE", TOK_BANKBYTE },
+ { ".BANKBYTES", TOK_BANKBYTES },
{ ".BITAND", TOK_AND },
{ ".BITNOT", TOK_NOT },
{ ".BITOR", TOK_OR },
{ ".GLOBAL", TOK_GLOBAL },
{ ".GLOBALZP", TOK_GLOBALZP },
{ ".HIBYTE", TOK_HIBYTE },
+ { ".HIBYTES", TOK_HIBYTES },
{ ".HIWORD", TOK_HIWORD },
{ ".I16", TOK_I16 },
{ ".I8", TOK_I8 },
{ ".LIST", TOK_LIST },
{ ".LISTBYTES", TOK_LISTBYTES },
{ ".LOBYTE", TOK_LOBYTE },
+ { ".LOBYTES", TOK_LOBYTES },
{ ".LOCAL", TOK_LOCAL },
{ ".LOCALCHAR", TOK_LOCALCHAR },
{ ".LOWORD", TOK_LOWORD },
{ ".MACPACK", TOK_MACPACK },
{ ".MACRO", TOK_MACRO },
{ ".MATCH", TOK_MATCH },
+ { ".MAX", TOK_MAX },
{ ".MID", TOK_MID },
+ { ".MIN", TOK_MIN },
{ ".MOD", TOK_MOD },
{ ".NOT", TOK_BOOLNOT },
{ ".NULL", TOK_NULL },
-void NewInputFile (const char* Name)
-/* Open a new input file */
+int NewInputFile (const char* Name)
+/* Open a new input file. Returns true if the file could be successfully opened
+ * and false otherwise.
+ */
{
+ int RetCode = 0; /* Return code. Assume an error. */
char* PathName = 0;
/* First try to open the file */
/* We are on include level. Search for the file in the include
* directories.
*/
- PathName = FindInclude (Name);
+ PathName = FindInclude (Name, INC_STD);
if (PathName == 0 || (F = fopen (PathName, "r")) == 0) {
/* Not found or cannot open, print an error and bail out */
Error ("Cannot open include file `%s': %s", Name, strerror (errno));
+ goto ExitPoint;
}
/* Use the path name from now on */
UseCharSource (S);
}
+ /* File successfully opened */
+ RetCode = 1;
+
+ExitPoint:
/* Free an allocated name buffer */
xfree (PathName);
+
+ /* Return the success code */
+ return RetCode;
}
break;
case 'S':
- Tok = TOK_S;
- return;
+ if (CPU == CPU_65816) {
+ Tok = TOK_S;
+ return;
+ }
+ break;
case 'X':
Tok = TOK_X;
NextChar ();
if (C != '*') {
Tok = TOK_DIV;
- } else {
+ } else if (CComments) {
/* Remember the position, then skip the '*' */
FilePos Pos = CurPos;
NextChar ();
while (C != '*') {
if (C == EOF) {
PError (&Pos, "Unterminated comment");
- goto Again;
+ goto CharAgain;
}
NextChar ();
}
NextChar ();
} while (C != '/');
NextChar ();
- goto Again;
+ goto Again;
}
return;
* error message and return ADDR_SIZE_DEFAULT.
*/
{
- static const char* Keys[] = {
- "DIRECT", "ZEROPAGE", "ZP",
- "ABSOLUTE", "ABS", "NEAR",
- "FAR",
- "LONG", "DWORD",
- };
+ unsigned char AddrSize;
/* Check for an identifier */
if (Tok != TOK_IDENT) {
return ADDR_SIZE_DEFAULT;
}
- /* Search for the attribute */
- switch (GetSubKey (Keys, sizeof (Keys) / sizeof (Keys [0]))) {
- case 0:
- case 1:
- case 2: return ADDR_SIZE_ZP;
- case 3:
- case 4:
- case 5: return ADDR_SIZE_ABS;
- case 6: return ADDR_SIZE_FAR;
- case 7:
- case 8: return ADDR_SIZE_LONG;
- default:
- Error ("Address size specifier expected");
- return ADDR_SIZE_DEFAULT;
+ /* Convert the attribute */
+ AddrSize = AddrSizeFromStr (SB_GetConstBuf (&SVal));
+ if (AddrSize == ADDR_SIZE_INVALID) {
+ Error ("Address size specifier expected");
+ AddrSize = ADDR_SIZE_DEFAULT;
}
+
+ /* Done */
+ return AddrSize;
}