The -A and --ansi switches are gone, together with the __STRICT_ANSI__
predefined macro. Instead there is now a command line option --standard that allows to set c89, c99 or cc65 as language standard. The compiler defines a macro __CC65_STD__ that is one of __CC65_STD_C89__, __CC65_STD_C99__ or __CC65_STD_CC65__ depending on the command line option. Default is cc65 (all extensions) as before. git-svn-id: svn://svn.cc65.org/cc65/trunk@3133 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
100
doc/cc65.sgml
100
doc/cc65.sgml
@@ -54,7 +54,6 @@ The compiler may be called as follows:
|
|||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
Usage: cc65 [options] file
|
Usage: cc65 [options] file
|
||||||
Short options:
|
Short options:
|
||||||
-A Strict ANSI mode
|
|
||||||
-Cl Make local variables static
|
-Cl Make local variables static
|
||||||
-Dsym[=defn] Define a symbol
|
-Dsym[=defn] Define a symbol
|
||||||
-I dir Set an include directory search path
|
-I dir Set an include directory search path
|
||||||
@@ -76,7 +75,6 @@ Short options:
|
|||||||
|
|
||||||
Long options:
|
Long options:
|
||||||
--add-source Include source as comment
|
--add-source Include source as comment
|
||||||
--ansi Strict ANSI mode
|
|
||||||
--bss-name seg Set the name of the BSS segment
|
--bss-name seg Set the name of the BSS segment
|
||||||
--check-stack Generate stack overflow checks
|
--check-stack Generate stack overflow checks
|
||||||
--code-name seg Set the name of the CODE segment
|
--code-name seg Set the name of the CODE segment
|
||||||
@@ -93,6 +91,7 @@ Long options:
|
|||||||
--register-vars Enable register variables
|
--register-vars Enable register variables
|
||||||
--rodata-name seg Set the name of the RODATA segment
|
--rodata-name seg Set the name of the RODATA segment
|
||||||
--signed-chars Default characters are signed
|
--signed-chars Default characters are signed
|
||||||
|
--standard std Language standard (c89, c99, cc65)
|
||||||
--static-locals Make local variables static
|
--static-locals Make local variables static
|
||||||
--target sys Set the target system
|
--target sys Set the target system
|
||||||
--verbose Increase verbosity
|
--verbose Increase verbosity
|
||||||
@@ -108,14 +107,6 @@ Here is a description of all the command line options:
|
|||||||
|
|
||||||
<descrip>
|
<descrip>
|
||||||
|
|
||||||
<label id="option-A">
|
|
||||||
<tag><tt>-A, --ansi</tt></tag>
|
|
||||||
|
|
||||||
This option disables any compiler exensions. Have a look at section 5
|
|
||||||
for a discussion of compiler extensions. In addition, the macro
|
|
||||||
<tt/__STRICT_ANSI__/ is defined, when using one of these options.
|
|
||||||
|
|
||||||
|
|
||||||
<tag><tt>--bss-name seg</tt></tag>
|
<tag><tt>--bss-name seg</tt></tag>
|
||||||
|
|
||||||
Set the name of the bss segment.
|
Set the name of the bss segment.
|
||||||
@@ -240,6 +231,18 @@ Here is a description of all the command line options:
|
|||||||
signedchars"></tt> for better control of this option.
|
signedchars"></tt> for better control of this option.
|
||||||
|
|
||||||
|
|
||||||
|
<label id="option--standard">
|
||||||
|
<tag><tt>--standard std</tt></tag>
|
||||||
|
|
||||||
|
This option allows to set the language standard supported. The argument is
|
||||||
|
one of
|
||||||
|
<itemize>
|
||||||
|
<item>c89
|
||||||
|
<item>c99
|
||||||
|
<item>cc65
|
||||||
|
</itemize>
|
||||||
|
|
||||||
|
|
||||||
<tag><tt>-t target, --target target</tt></tag>
|
<tag><tt>-t target, --target target</tt></tag>
|
||||||
|
|
||||||
This option is used to set the target system. The target system
|
This option is used to set the target system. The target system
|
||||||
@@ -249,16 +252,20 @@ Here is a description of all the command line options:
|
|||||||
<itemize>
|
<itemize>
|
||||||
<item>none
|
<item>none
|
||||||
<item>apple2
|
<item>apple2
|
||||||
|
<item>apple2enh
|
||||||
<item>atari
|
<item>atari
|
||||||
<item>atmos
|
<item>atmos
|
||||||
<item>c16 (works also for the c116 with memory up to 32K)
|
<item>c16 (works also for the c116 with memory up to 32K)
|
||||||
<item>c64
|
<item>c64
|
||||||
<item>c128
|
<item>c128
|
||||||
<item>plus4
|
|
||||||
<item>cbm510 (CBM-II series with 40 column video)
|
<item>cbm510 (CBM-II series with 40 column video)
|
||||||
<item>cbm610 (all CBM-II II computers with 80 column video)
|
<item>cbm610 (all CBM-II II computers with 80 column video)
|
||||||
<item>pet (all CBM PET systems except the 2001)
|
|
||||||
<item>geos
|
<item>geos
|
||||||
|
<item>lunix
|
||||||
|
<item>nes
|
||||||
|
<item>pet (all CBM PET systems except the 2001)
|
||||||
|
<item>plus4
|
||||||
|
<item>supervision
|
||||||
</itemize>
|
</itemize>
|
||||||
|
|
||||||
<tag><tt>-v, --verbose</tt></tag>
|
<tag><tt>-v, --verbose</tt></tag>
|
||||||
@@ -396,12 +403,10 @@ and the one defined by the ISO standard:
|
|||||||
|
|
||||||
<itemize>
|
<itemize>
|
||||||
|
|
||||||
<item> The compiler allows single line comments that start with //. This
|
|
||||||
feature is disabled in strict ANSI mode.
|
|
||||||
<p>
|
|
||||||
<item> The compiler allows unnamed parameters in parameter lists. The
|
<item> The compiler allows unnamed parameters in parameter lists. The
|
||||||
compiler will not issue warnings about unused parameters that don't
|
compiler will not issue warnings about unused parameters that don't
|
||||||
have a name. This feature is disabled in strict ANSI mode.
|
have a name. This feature can be disabled with the <tt><ref
|
||||||
|
id="option--standard" name="--standard"></tt> command line option.
|
||||||
<p>
|
<p>
|
||||||
<item> The compiler has some additional keywords:
|
<item> The compiler has some additional keywords:
|
||||||
<p>
|
<p>
|
||||||
@@ -416,7 +421,9 @@ and the one defined by the ISO standard:
|
|||||||
<item><tt/__attribute__/
|
<item><tt/__attribute__/
|
||||||
</itemize>
|
</itemize>
|
||||||
<p>
|
<p>
|
||||||
The keywords without the underlines are disabled in strict ANSI mode.
|
The keywords without the underlines can be disabled with the
|
||||||
|
<tt><ref id="option--standard" name="--standard"></tt> command line
|
||||||
|
option.
|
||||||
<p>
|
<p>
|
||||||
<item> The datatypes "float" and "double" are not available.
|
<item> The datatypes "float" and "double" are not available.
|
||||||
<p>
|
<p>
|
||||||
@@ -430,7 +437,7 @@ and the one defined by the ISO standard:
|
|||||||
conventions (see below). This means, that you may not mix pointers to
|
conventions (see below). This means, that you may not mix pointers to
|
||||||
those functions with pointers to user written functions.
|
those functions with pointers to user written functions.
|
||||||
<p>
|
<p>
|
||||||
</itemize>
|
</itemize>
|
||||||
|
|
||||||
There may be some more minor differences, I'm currently not aware off. The
|
There may be some more minor differences, I'm currently not aware off. The
|
||||||
biggest problem is the missing float data type. With this limitation in
|
biggest problem is the missing float data type. With this limitation in
|
||||||
@@ -444,11 +451,6 @@ This cc65 version has some extensions to the ISO C standard.
|
|||||||
|
|
||||||
<itemize>
|
<itemize>
|
||||||
|
|
||||||
<item> The compiler allows // comments (like in C++ and in the proposed C9x
|
|
||||||
standard). This feature is disabled by <tt><ref id="option-A"
|
|
||||||
name="-A"></tt>.
|
|
||||||
<p>
|
|
||||||
|
|
||||||
<item> The compiler allows to insert assembler statements into the output
|
<item> The compiler allows to insert assembler statements into the output
|
||||||
file. The syntax is
|
file. The syntax is
|
||||||
|
|
||||||
@@ -482,8 +484,9 @@ This cc65 version has some extensions to the ISO C standard.
|
|||||||
<tscreen><verb>
|
<tscreen><verb>
|
||||||
void __fastcall__ f (unsigned char c)
|
void __fastcall__ f (unsigned char c)
|
||||||
</verb></tscreen>
|
</verb></tscreen>
|
||||||
The first form of the fastcall keyword is in the user namespace and is
|
The first form of the fastcall keyword is in the user namespace and can
|
||||||
therefore disabled in strict ANSI mode.
|
therefore be disabled with the <tt><ref id="option--standard"
|
||||||
|
name="--standard"></tt> command line option.
|
||||||
|
|
||||||
For functions declared as <tt/fastcall/, the rightmost parameter is not
|
For functions declared as <tt/fastcall/, the rightmost parameter is not
|
||||||
pushed on the stack but left in the primary register when the function
|
pushed on the stack but left in the primary register when the function
|
||||||
@@ -549,10 +552,10 @@ This cc65 version has some extensions to the ISO C standard.
|
|||||||
<p>
|
<p>
|
||||||
|
|
||||||
<item> cc65 implements flexible array struct members as defined in the C99 ISO
|
<item> cc65 implements flexible array struct members as defined in the C99 ISO
|
||||||
standard. As an extension, in non ANSI mode, these fields may be
|
standard. As an extension, these fields may be initialized. There are
|
||||||
initialized. There are several exceptions, however (which is probably
|
several exceptions, however (which is probably the reason why the
|
||||||
the reason why the standard does not define this feature, because it is
|
standard does not define this feature, because it is highly
|
||||||
highly unorthogonal). Flexible array members cannot be initialized...
|
unorthogonal). Flexible array members cannot be initialized...
|
||||||
|
|
||||||
<itemize>
|
<itemize>
|
||||||
<item> ...when defining an array of structs with flexible members.
|
<item> ...when defining an array of structs with flexible members.
|
||||||
@@ -647,10 +650,15 @@ The compiler defines several macros at startup:
|
|||||||
|
|
||||||
This macro expands to the current line number.
|
This macro expands to the current line number.
|
||||||
|
|
||||||
<tag><tt>__STRICT_ANSI__</tt></tag>
|
<tag><tt>__CC65_STD__</tt></tag>
|
||||||
|
|
||||||
This macro is defined to 1 if the <tt/-A/ compiler option was given, and
|
This macro is defined to one of the following depending on the <tt><ref
|
||||||
undefined otherwise.
|
id="option--standard" name="--standard"></tt> command line option:
|
||||||
|
<itemize>
|
||||||
|
<item><tt/__CC65_STD_C89__/
|
||||||
|
<item><tt/__CC65_STD_C99__/
|
||||||
|
<item><tt/__CC65_STD_CCC65__/
|
||||||
|
</itemize>
|
||||||
|
|
||||||
<tag><tt>__OPT__</tt></tag>
|
<tag><tt>__OPT__</tt></tag>
|
||||||
|
|
||||||
@@ -964,7 +972,7 @@ or
|
|||||||
<p>
|
<p>
|
||||||
|
|
||||||
The first form is in the user namespace and is disabled by <tt><ref
|
The first form is in the user namespace and is disabled by <tt><ref
|
||||||
id="option-A" name="-A"></tt>.
|
id="option--standard" name="--standard"></tt> if the argument is not <tt/cc65/.
|
||||||
|
|
||||||
The asm statement may be used inside a function and on global file level. An
|
The asm statement may be used inside a function and on global file level. An
|
||||||
inline assembler statement is a primary expression, so it may also be used as
|
inline assembler statement is a primary expression, so it may also be used as
|
||||||
@@ -1090,14 +1098,28 @@ This is the original compiler copyright:
|
|||||||
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
||||||
</verb></tscreen>
|
</verb></tscreen>
|
||||||
|
|
||||||
In acknowledgment of this copyright, I will place my own changes to the
|
Small parts of the compiler (parts of the preprocessor and main parser) are
|
||||||
compiler under the same copyright. Please note however, that the library
|
still covered by this copyright. The main portion is covered by the usual
|
||||||
and all binutils are covered by another copyright, and that I'm planning
|
cc65 license, which reads:
|
||||||
to do a complete rewrite of the compiler, after which the compiler
|
|
||||||
copyright will also change.
|
|
||||||
|
|
||||||
For the list of changes requested by this copyright see newvers.txt.
|
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:
|
||||||
|
|
||||||
|
<enum>
|
||||||
|
<item> 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.
|
||||||
|
<item> Altered source versions must be plainly marked as such, and must not
|
||||||
|
be misrepresented as being the original software.
|
||||||
|
<item> This notice may not be removed or altered from any source
|
||||||
|
distribution.
|
||||||
|
</enum>
|
||||||
|
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,6 @@ Short options:
|
|||||||
-t sys Set the target system
|
-t sys Set the target system
|
||||||
-v Verbose mode
|
-v Verbose mode
|
||||||
-vm Verbose map file
|
-vm Verbose map file
|
||||||
-A Strict ANSI mode
|
|
||||||
-C name Use linker config file
|
-C name Use linker config file
|
||||||
-Cl Make local variables static
|
-Cl Make local variables static
|
||||||
-D sym[=defn] Define a preprocessor symbol
|
-D sym[=defn] Define a preprocessor symbol
|
||||||
@@ -63,7 +62,6 @@ Short options:
|
|||||||
|
|
||||||
Long options:
|
Long options:
|
||||||
--add-source Include source as comment
|
--add-source Include source as comment
|
||||||
--ansi Strict ANSI mode
|
|
||||||
--asm-include-dir dir Set an assembler include directory
|
--asm-include-dir dir Set an assembler include directory
|
||||||
--bss-label name Define and export a BSS segment label
|
--bss-label name Define and export a BSS segment label
|
||||||
--bss-name seg Set the name of the BSS segment
|
--bss-name seg Set the name of the BSS segment
|
||||||
@@ -94,6 +92,7 @@ Long options:
|
|||||||
--register-vars Enable register variables
|
--register-vars Enable register variables
|
||||||
--rodata-name seg Set the name of the RODATA segment
|
--rodata-name seg Set the name of the RODATA segment
|
||||||
--signed-chars Default characters are signed
|
--signed-chars Default characters are signed
|
||||||
|
--standard std Language standard (c89, c99, cc65)
|
||||||
--start-addr addr Set the default start address
|
--start-addr addr Set the default start address
|
||||||
--static-locals Make local variables static
|
--static-locals Make local variables static
|
||||||
--target sys Set the target system
|
--target sys Set the target system
|
||||||
@@ -229,7 +228,7 @@ free to contact me by email (<htmlurl url="mailto:uz@cc65.org" name="uz@cc65.org
|
|||||||
|
|
||||||
<sect>Copyright<p>
|
<sect>Copyright<p>
|
||||||
|
|
||||||
cl65 (and all cc65 binutils) are (C) Copyright 1998-2000 Ullrich von
|
cl65 (and all cc65 binutils) are (C) Copyright 1998-2004 Ullrich von
|
||||||
Bassewitz. For usage of the binaries and/or sources the following
|
Bassewitz. For usage of the binaries and/or sources the following
|
||||||
conditions do apply:
|
conditions do apply:
|
||||||
|
|
||||||
|
|||||||
@@ -6,10 +6,10 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 1998-2000 Ullrich von Bassewitz */
|
/* (C) 1998-2004 Ullrich von Bassewitz */
|
||||||
/* Wacholderweg 14 */
|
/* R<EFBFBD>merstrasse 52 */
|
||||||
/* D-70597 Stuttgart */
|
/* D-70794 Filderstadt */
|
||||||
/* EMail: uz@musoftware.de */
|
/* EMail: uz@cc65.org */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* This software is provided 'as-is', without any expressed or implied */
|
/* This software is provided 'as-is', without any expressed or implied */
|
||||||
@@ -70,10 +70,12 @@ int __fastcall__ ispunct (int c);
|
|||||||
int __fastcall__ isspace (int c);
|
int __fastcall__ isspace (int c);
|
||||||
int __fastcall__ isupper (int c);
|
int __fastcall__ isupper (int c);
|
||||||
int __fastcall__ isxdigit (int c);
|
int __fastcall__ isxdigit (int c);
|
||||||
|
#if __CC65_STD__ >= __CC65_STD_C99__
|
||||||
int __fastcall__ isblank (int c); /* New in C99 */
|
int __fastcall__ isblank (int c); /* New in C99 */
|
||||||
|
#endif
|
||||||
|
|
||||||
int __fastcall__ toupper (int c); /* Always external */
|
int __fastcall__ toupper (int c); /* Always external */
|
||||||
int __fastcall__ tolower (int c); /* Always external */
|
int __fastcall__ tolower (int c); /* Always external */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -88,32 +90,34 @@ int __fastcall__ tolower (int c); /* Always external */
|
|||||||
|
|
||||||
#define isalnum(c) (__AX__ = (c), \
|
#define isalnum(c) (__AX__ = (c), \
|
||||||
__asm__ ("tay"), \
|
__asm__ ("tay"), \
|
||||||
__asm__ ("lda %v,y", _ctype), \
|
__asm__ ("lda %v,y", _ctype), \
|
||||||
__asm__ ("and #%b", _CT_ALNUM), \
|
__asm__ ("and #%b", _CT_ALNUM), \
|
||||||
__AX__)
|
__AX__)
|
||||||
|
|
||||||
#define isalpha(c) (__AX__ = (c), \
|
#define isalpha(c) (__AX__ = (c), \
|
||||||
__asm__ ("tay"), \
|
__asm__ ("tay"), \
|
||||||
__asm__ ("lda %v,y", _ctype), \
|
__asm__ ("lda %v,y", _ctype), \
|
||||||
__asm__ ("and #%b", _CT_ALPHA), \
|
__asm__ ("and #%b", _CT_ALPHA), \
|
||||||
__AX__)
|
__AX__)
|
||||||
|
|
||||||
|
#if __CC65_STD__ >= __CC65_STD_C99__
|
||||||
#define isblank(c) (__AX__ = (c), \
|
#define isblank(c) (__AX__ = (c), \
|
||||||
__asm__ ("tay"), \
|
__asm__ ("tay"), \
|
||||||
__asm__ ("lda %v,y", _ctype), \
|
__asm__ ("lda %v,y", _ctype), \
|
||||||
__asm__ ("and #%b", _CT_SPACE_TAB), \
|
__asm__ ("and #%b", _CT_SPACE_TAB), \
|
||||||
__AX__)
|
__AX__)
|
||||||
|
#endif
|
||||||
|
|
||||||
#define iscntrl(c) (__AX__ = (c), \
|
#define iscntrl(c) (__AX__ = (c), \
|
||||||
__asm__ ("tay"), \
|
__asm__ ("tay"), \
|
||||||
__asm__ ("lda %v,y", _ctype), \
|
__asm__ ("lda %v,y", _ctype), \
|
||||||
__asm__ ("and #%b", _CT_CNTRL), \
|
__asm__ ("and #%b", _CT_CNTRL), \
|
||||||
__AX__)
|
__AX__)
|
||||||
|
|
||||||
#define isdigit(c) (__AX__ = (c), \
|
#define isdigit(c) (__AX__ = (c), \
|
||||||
__asm__ ("tay"), \
|
__asm__ ("tay"), \
|
||||||
__asm__ ("lda %v,y", _ctype), \
|
__asm__ ("lda %v,y", _ctype), \
|
||||||
__asm__ ("and #%b", _CT_DIGIT), \
|
__asm__ ("and #%b", _CT_DIGIT), \
|
||||||
__AX__)
|
__AX__)
|
||||||
|
|
||||||
#define isgraph(c) (__AX__ = (c), \
|
#define isgraph(c) (__AX__ = (c), \
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ int __fastcall__ vscanf (const char* format, va_list ap);
|
|||||||
int __fastcall__ vsscanf (const char* s, const char* format, va_list ap);
|
int __fastcall__ vsscanf (const char* s, const char* format, va_list ap);
|
||||||
int __fastcall__ vfscanf (FILE* f, const char* format, va_list ap);
|
int __fastcall__ vfscanf (FILE* f, const char* format, va_list ap);
|
||||||
|
|
||||||
#ifndef __STRICT_ANSI__
|
#if __CC65_STD__ == __CC65_STD_CC65__
|
||||||
FILE* __fastcall__ fdopen (int fd, const char* mode); /* Unix */
|
FILE* __fastcall__ fdopen (int fd, const char* mode); /* Unix */
|
||||||
int __fastcall__ fileno (FILE* f); /* Unix */
|
int __fastcall__ fileno (FILE* f); /* Unix */
|
||||||
#endif
|
#endif
|
||||||
@@ -141,7 +141,7 @@ void __fastcall__ _poserror (const char* msg); /* cc65 */
|
|||||||
#define putc(c, f) fputc (c, f) /* ANSI */
|
#define putc(c, f) fputc (c, f) /* ANSI */
|
||||||
|
|
||||||
/* Non-standard function like macros */
|
/* Non-standard function like macros */
|
||||||
#ifndef __STRICT_ANSI__
|
#if __CC65_STD__ == __CC65_STD_CC65__
|
||||||
#define flushall() /* Unix */
|
#define flushall() /* Unix */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -152,4 +152,3 @@ void __fastcall__ _poserror (const char* msg); /* cc65 */
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 1998-2003 Ullrich von Bassewitz */
|
/* (C) 1998-2004 Ullrich von Bassewitz */
|
||||||
/* R<>merstrasse 52 */
|
/* R<>merstrasse 52 */
|
||||||
/* D-70794 Filderstadt */
|
/* D-70794 Filderstadt */
|
||||||
/* EMail: uz@cc65.org */
|
/* EMail: uz@cc65.org */
|
||||||
@@ -95,7 +95,7 @@ int system (const char* s);
|
|||||||
|
|
||||||
/* Non-ANSI functions */
|
/* Non-ANSI functions */
|
||||||
void __fastcall__ _swap (void* p, void* q, size_t size);
|
void __fastcall__ _swap (void* p, void* q, size_t size);
|
||||||
#ifndef __STRICT_ANSI__
|
#if __CC65_STD__ == __CC65_STD_CC65__
|
||||||
char* __fastcall__ itoa (int val, char* buf, int radix);
|
char* __fastcall__ itoa (int val, char* buf, int radix);
|
||||||
char* __fastcall__ utoa (unsigned val, char* buf, int radix);
|
char* __fastcall__ utoa (unsigned val, char* buf, int radix);
|
||||||
char* __fastcall__ ltoa (long val, char* buf, int radix);
|
char* __fastcall__ ltoa (long val, char* buf, int radix);
|
||||||
|
|||||||
@@ -6,10 +6,10 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 1998-2000 Ullrich von Bassewitz */
|
/* (C) 1998-2004 Ullrich von Bassewitz */
|
||||||
/* Wacholderweg 14 */
|
/* R<EFBFBD>merstrasse 52 */
|
||||||
/* D-70597 Stuttgart */
|
/* D-70794 Filderstadt */
|
||||||
/* EMail: uz@musoftware.de */
|
/* EMail: uz@cc65.org */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* This software is provided 'as-is', without any expressed or implied */
|
/* This software is provided 'as-is', without any expressed or implied */
|
||||||
@@ -70,7 +70,7 @@ void* __fastcall__ memset (void* s, int c, size_t count);
|
|||||||
void* __fastcall__ _bzero (void* ptr, size_t n);
|
void* __fastcall__ _bzero (void* ptr, size_t n);
|
||||||
|
|
||||||
/* Non standard: */
|
/* Non standard: */
|
||||||
#ifndef __STRICT_ANSI__
|
#if __CC65_STD__ == __CC65_STD_CC65__
|
||||||
void __fastcall__ bzero (void* ptr, size_t n); /* BSD */
|
void __fastcall__ bzero (void* ptr, size_t n); /* BSD */
|
||||||
char* __fastcall__ strdup (const char* s); /* SYSV/BSD */
|
char* __fastcall__ strdup (const char* s); /* SYSV/BSD */
|
||||||
int __fastcall__ stricmp (const char* s1, const char* s2); /* DOS/Windows */
|
int __fastcall__ stricmp (const char* s1, const char* s2); /* DOS/Windows */
|
||||||
|
|||||||
@@ -46,6 +46,7 @@
|
|||||||
#include "asmlabel.h"
|
#include "asmlabel.h"
|
||||||
#include "asmstmt.h"
|
#include "asmstmt.h"
|
||||||
#include "codegen.h"
|
#include "codegen.h"
|
||||||
|
#include "compile.h"
|
||||||
#include "declare.h"
|
#include "declare.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "expr.h"
|
#include "expr.h"
|
||||||
@@ -55,8 +56,8 @@
|
|||||||
#include "litpool.h"
|
#include "litpool.h"
|
||||||
#include "macrotab.h"
|
#include "macrotab.h"
|
||||||
#include "pragma.h"
|
#include "pragma.h"
|
||||||
|
#include "standard.h"
|
||||||
#include "symtab.h"
|
#include "symtab.h"
|
||||||
#include "compile.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -286,16 +287,17 @@ void Compile (const char* FileName)
|
|||||||
/* Add macros that are always defined */
|
/* Add macros that are always defined */
|
||||||
DefineNumericMacro ("__CC65__", VERSION);
|
DefineNumericMacro ("__CC65__", VERSION);
|
||||||
|
|
||||||
/* Strict ANSI macro */
|
/* Language standard that is supported */
|
||||||
if (ANSI) {
|
DefineNumericMacro ("__CC65_STD_C89__", STD_C89);
|
||||||
DefineNumericMacro ("__STRICT_ANSI__", 1);
|
DefineNumericMacro ("__CC65_STD_C99__", STD_C99);
|
||||||
}
|
DefineNumericMacro ("__CC65_STD_CC65__", STD_CC65);
|
||||||
|
DefineNumericMacro ("__CC65_STD__", IS_Get (&Standard));
|
||||||
|
|
||||||
/* Optimization macros. Since no source code has been parsed for now, the
|
/* Optimization macros. Since no source code has been parsed for now, the
|
||||||
* IS_Get functions access the values in effect now, regardless of any
|
* IS_Get functions access the values in effect now, regardless of any
|
||||||
* changes using #pragma later.
|
* changes using #pragma later.
|
||||||
*/
|
*/
|
||||||
if (IS_Get (&Optimize)) {
|
if (IS_Get (&Optimize)) {
|
||||||
long CodeSize = IS_Get (&CodeSizeFactor);
|
long CodeSize = IS_Get (&CodeSizeFactor);
|
||||||
DefineNumericMacro ("__OPT__", 1);
|
DefineNumericMacro ("__OPT__", 1);
|
||||||
if (CodeSize > 100) {
|
if (CodeSize > 100) {
|
||||||
|
|||||||
@@ -56,6 +56,7 @@
|
|||||||
#include "litpool.h"
|
#include "litpool.h"
|
||||||
#include "pragma.h"
|
#include "pragma.h"
|
||||||
#include "scanner.h"
|
#include "scanner.h"
|
||||||
|
#include "standard.h"
|
||||||
#include "symtab.h"
|
#include "symtab.h"
|
||||||
#include "typeconv.h"
|
#include "typeconv.h"
|
||||||
|
|
||||||
@@ -794,10 +795,11 @@ static void ParseAnsiParamList (FuncDesc* F)
|
|||||||
|
|
||||||
/* Check if this is a function definition */
|
/* Check if this is a function definition */
|
||||||
if (CurTok.Tok == TOK_LCURLY) {
|
if (CurTok.Tok == TOK_LCURLY) {
|
||||||
/* Print an error if in strict ANSI mode and we have unnamed
|
/* Print an error if we have unnamed parameters and cc65 extensions
|
||||||
* parameters.
|
* are disabled.
|
||||||
*/
|
*/
|
||||||
if (ANSI && (F->Flags & FD_UNNAMED_PARAMS) != 0) {
|
if (IS_Get (&Standard) != STD_CC65 &&
|
||||||
|
(F->Flags & FD_UNNAMED_PARAMS) != 0) {
|
||||||
Error ("Parameter name omitted");
|
Error ("Parameter name omitted");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1512,7 +1514,7 @@ static unsigned ParseInitInternal (type* T, int AllowFlexibleMembers)
|
|||||||
return ParseStructInit (T, AllowFlexibleMembers);
|
return ParseStructInit (T, AllowFlexibleMembers);
|
||||||
|
|
||||||
case T_VOID:
|
case T_VOID:
|
||||||
if (!ANSI) {
|
if (IS_Get (&Standard) == STD_CC65) {
|
||||||
/* Special cc65 extension in non ANSI mode */
|
/* Special cc65 extension in non ANSI mode */
|
||||||
return ParseVoidInit ();
|
return ParseVoidInit ();
|
||||||
}
|
}
|
||||||
@@ -1530,8 +1532,10 @@ static unsigned ParseInitInternal (type* T, int AllowFlexibleMembers)
|
|||||||
unsigned ParseInit (type* T)
|
unsigned ParseInit (type* T)
|
||||||
/* Parse initialization of variables. Return the number of data bytes. */
|
/* Parse initialization of variables. Return the number of data bytes. */
|
||||||
{
|
{
|
||||||
/* Parse the initialization */
|
/* Parse the initialization. Flexible array members can only be initialized
|
||||||
unsigned Size = ParseInitInternal (T, !ANSI);
|
* in cc65 mode.
|
||||||
|
*/
|
||||||
|
unsigned Size = ParseInitInternal (T, IS_Get (&Standard) == STD_CC65);
|
||||||
|
|
||||||
/* The initialization may not generate code on global level, because code
|
/* The initialization may not generate code on global level, because code
|
||||||
* outside function scope will never get executed.
|
* outside function scope will never get executed.
|
||||||
|
|||||||
@@ -49,6 +49,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Options */
|
||||||
extern unsigned char AddSource; /* Add source lines as comments */
|
extern unsigned char AddSource; /* Add source lines as comments */
|
||||||
extern unsigned char DebugInfo; /* Add debug info to the obj */
|
extern unsigned char DebugInfo; /* Add debug info to the obj */
|
||||||
extern unsigned char CreateDep; /* Create a dependency file */
|
extern unsigned char CreateDep; /* Create a dependency file */
|
||||||
|
|||||||
@@ -63,6 +63,7 @@
|
|||||||
#include "input.h"
|
#include "input.h"
|
||||||
#include "macrotab.h"
|
#include "macrotab.h"
|
||||||
#include "scanner.h"
|
#include "scanner.h"
|
||||||
|
#include "standard.h"
|
||||||
#include "segments.h"
|
#include "segments.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -79,7 +80,6 @@ static void Usage (void)
|
|||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
"Usage: %s [options] file\n"
|
"Usage: %s [options] file\n"
|
||||||
"Short options:\n"
|
"Short options:\n"
|
||||||
" -A\t\t\tStrict ANSI mode\n"
|
|
||||||
" -Cl\t\t\tMake local variables static\n"
|
" -Cl\t\t\tMake local variables static\n"
|
||||||
" -Dsym[=defn]\t\tDefine a symbol\n"
|
" -Dsym[=defn]\t\tDefine a symbol\n"
|
||||||
" -I dir\t\tSet an include directory search path\n"
|
" -I dir\t\tSet an include directory search path\n"
|
||||||
@@ -102,7 +102,6 @@ static void Usage (void)
|
|||||||
"\n"
|
"\n"
|
||||||
"Long options:\n"
|
"Long options:\n"
|
||||||
" --add-source\t\tInclude source as comment\n"
|
" --add-source\t\tInclude source as comment\n"
|
||||||
" --ansi\t\tStrict ANSI mode\n"
|
|
||||||
" --bss-name seg\tSet the name of the BSS segment\n"
|
" --bss-name seg\tSet the name of the BSS segment\n"
|
||||||
" --check-stack\t\tGenerate stack overflow checks\n"
|
" --check-stack\t\tGenerate stack overflow checks\n"
|
||||||
" --code-name seg\tSet the name of the CODE segment\n"
|
" --code-name seg\tSet the name of the CODE segment\n"
|
||||||
@@ -124,6 +123,7 @@ static void Usage (void)
|
|||||||
" --register-vars\tEnable register variables\n"
|
" --register-vars\tEnable register variables\n"
|
||||||
" --rodata-name seg\tSet the name of the RODATA segment\n"
|
" --rodata-name seg\tSet the name of the RODATA segment\n"
|
||||||
" --signed-chars\tDefault characters are signed\n"
|
" --signed-chars\tDefault characters are signed\n"
|
||||||
|
" --standard std\tLanguage standard (c89, c99, cc65)\n"
|
||||||
" --static-locals\tMake local variables static\n"
|
" --static-locals\tMake local variables static\n"
|
||||||
" --target sys\t\tSet the target system\n"
|
" --target sys\t\tSet the target system\n"
|
||||||
" --verbose\t\tIncrease verbosity\n"
|
" --verbose\t\tIncrease verbosity\n"
|
||||||
@@ -329,15 +329,6 @@ static void OptAddSource (const char* Opt attribute ((unused)),
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void OptAnsi (const char* Opt attribute ((unused)),
|
|
||||||
const char* Arg attribute ((unused)))
|
|
||||||
/* Compile in strict ANSI mode */
|
|
||||||
{
|
|
||||||
ANSI = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void OptBssName (const char* Opt attribute ((unused)), const char* Arg)
|
static void OptBssName (const char* Opt attribute ((unused)), const char* Arg)
|
||||||
/* Handle the --bss-name option */
|
/* Handle the --bss-name option */
|
||||||
{
|
{
|
||||||
@@ -627,6 +618,22 @@ static void OptSignedChars (const char* Opt attribute ((unused)),
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void OptStandard (const char* Opt, const char* Arg)
|
||||||
|
/* Handle the --standard option */
|
||||||
|
{
|
||||||
|
/* Find the standard from the given name */
|
||||||
|
standard_t Std = FindStandard (Arg);
|
||||||
|
if (Std == STD_UNKNOWN) {
|
||||||
|
AbEnd ("Invalid argument for %s: `%s'", Opt, Arg);
|
||||||
|
} else if (IS_Get (&Standard) != STD_UNKNOWN) {
|
||||||
|
AbEnd ("Option %s given more than once", Opt);
|
||||||
|
} else {
|
||||||
|
IS_Set (&Standard, Std);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void OptStaticLocals (const char* Opt attribute ((unused)),
|
static void OptStaticLocals (const char* Opt attribute ((unused)),
|
||||||
const char* Arg attribute ((unused)))
|
const char* Arg attribute ((unused)))
|
||||||
/* Place local variables in static storage */
|
/* Place local variables in static storage */
|
||||||
@@ -678,7 +685,6 @@ int main (int argc, char* argv[])
|
|||||||
/* Program long options */
|
/* Program long options */
|
||||||
static const LongOpt OptTab[] = {
|
static const LongOpt OptTab[] = {
|
||||||
{ "--add-source", 0, OptAddSource },
|
{ "--add-source", 0, OptAddSource },
|
||||||
{ "--ansi", 0, OptAnsi },
|
|
||||||
{ "--bss-name", 1, OptBssName },
|
{ "--bss-name", 1, OptBssName },
|
||||||
{ "--check-stack", 0, OptCheckStack },
|
{ "--check-stack", 0, OptCheckStack },
|
||||||
{ "--code-name", 1, OptCodeName },
|
{ "--code-name", 1, OptCodeName },
|
||||||
@@ -700,6 +706,7 @@ int main (int argc, char* argv[])
|
|||||||
{ "--register-vars", 0, OptRegisterVars },
|
{ "--register-vars", 0, OptRegisterVars },
|
||||||
{ "--rodata-name", 1, OptRodataName },
|
{ "--rodata-name", 1, OptRodataName },
|
||||||
{ "--signed-chars", 0, OptSignedChars },
|
{ "--signed-chars", 0, OptSignedChars },
|
||||||
|
{ "--standard", 1, OptStandard },
|
||||||
{ "--static-locals", 0, OptStaticLocals },
|
{ "--static-locals", 0, OptStaticLocals },
|
||||||
{ "--target", 1, OptTarget },
|
{ "--target", 1, OptTarget },
|
||||||
{ "--verbose", 0, OptVerbose },
|
{ "--verbose", 0, OptVerbose },
|
||||||
@@ -777,10 +784,6 @@ int main (int argc, char* argv[])
|
|||||||
OptVerbose (Arg, 0);
|
OptVerbose (Arg, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'A':
|
|
||||||
OptAnsi (Arg, 0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'C':
|
case 'C':
|
||||||
P = Arg + 2;
|
P = Arg + 2;
|
||||||
while (*P) {
|
while (*P) {
|
||||||
@@ -873,6 +876,11 @@ int main (int argc, char* argv[])
|
|||||||
SetMemoryModel (MMODEL_NEAR);
|
SetMemoryModel (MMODEL_NEAR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If no language standard was given, use the default one */
|
||||||
|
if (IS_Get (&Standard) == STD_UNKNOWN) {
|
||||||
|
IS_Set (&Standard, STD_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
/* Go! */
|
/* Go! */
|
||||||
Compile (InputFile);
|
Compile (InputFile);
|
||||||
|
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ OBJS = anonname.o \
|
|||||||
scanstrbuf.o \
|
scanstrbuf.o \
|
||||||
segments.o \
|
segments.o \
|
||||||
stackptr.o \
|
stackptr.o \
|
||||||
|
standard.o \
|
||||||
stdfunc.o \
|
stdfunc.o \
|
||||||
stdnames.o \
|
stdnames.o \
|
||||||
stmt.o \
|
stmt.o \
|
||||||
|
|||||||
@@ -114,6 +114,7 @@ OBJS = anonname.obj \
|
|||||||
scanstrbuf.obj \
|
scanstrbuf.obj \
|
||||||
segments.obj \
|
segments.obj \
|
||||||
stackptr.obj \
|
stackptr.obj \
|
||||||
|
standard.obj \
|
||||||
stdfunc.obj \
|
stdfunc.obj \
|
||||||
stdnames.obj \
|
stdnames.obj \
|
||||||
stmt.obj \
|
stmt.obj \
|
||||||
|
|||||||
@@ -23,9 +23,10 @@
|
|||||||
#include "input.h"
|
#include "input.h"
|
||||||
#include "lineinfo.h"
|
#include "lineinfo.h"
|
||||||
#include "macrotab.h"
|
#include "macrotab.h"
|
||||||
#include "scanner.h"
|
|
||||||
#include "util.h"
|
|
||||||
#include "preproc.h"
|
#include "preproc.h"
|
||||||
|
#include "scanner.h"
|
||||||
|
#include "standard.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -445,7 +446,7 @@ static int MacroCall (Macro* M)
|
|||||||
} else if (CurC == '/' && NextC == '*') {
|
} else if (CurC == '/' && NextC == '*') {
|
||||||
*B++ = ' ';
|
*B++ = ' ';
|
||||||
OldStyleComment ();
|
OldStyleComment ();
|
||||||
} else if (ANSI == 0 && CurC == '/' && NextC == '/') {
|
} else if (IS_Get (&Standard) >= STD_C99 && CurC == '/' && NextC == '/') {
|
||||||
*B++ = ' ';
|
*B++ = ' ';
|
||||||
NewStyleComment ();
|
NewStyleComment ();
|
||||||
} else if (CurC == '\0') {
|
} else if (CurC == '\0') {
|
||||||
@@ -637,7 +638,7 @@ static int Pass1 (const char* From, char* To)
|
|||||||
} else if (CurC == '/' && NextC == '*') {
|
} else if (CurC == '/' && NextC == '*') {
|
||||||
KeepChar (' ');
|
KeepChar (' ');
|
||||||
OldStyleComment ();
|
OldStyleComment ();
|
||||||
} else if (ANSI == 0 && CurC == '/' && NextC == '/') {
|
} else if (IS_Get (&Standard) >= STD_C99 && CurC == '/' && NextC == '/') {
|
||||||
KeepChar (' ');
|
KeepChar (' ');
|
||||||
NewStyleComment ();
|
NewStyleComment ();
|
||||||
} else {
|
} else {
|
||||||
@@ -755,7 +756,7 @@ static int PushIf (int Skip, int Invert, int Cond)
|
|||||||
|
|
||||||
static int DoIf (int Skip)
|
static int DoIf (int Skip)
|
||||||
/* Process #if directive */
|
/* Process #if directive */
|
||||||
{
|
{
|
||||||
ExprDesc Expr;
|
ExprDesc Expr;
|
||||||
char* S;
|
char* S;
|
||||||
|
|
||||||
@@ -1047,9 +1048,8 @@ void Preprocess (void)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PP_LINE:
|
case PP_LINE:
|
||||||
/* Not allowed in strict ANSI mode */
|
/* Should do something in C99 at least, but we ignore it */
|
||||||
if (!Skip && ANSI) {
|
if (!Skip) {
|
||||||
PPError ("Preprocessor directive expected");
|
|
||||||
ClearLine ();
|
ClearLine ();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 1998-2003 Ullrich von Bassewitz */
|
/* (C) 1998-2004 Ullrich von Bassewitz */
|
||||||
/* R<>merstrasse 52 */
|
/* R<>merstrasse 52 */
|
||||||
/* D-70794 Filderstadt */
|
/* D-70794 Filderstadt */
|
||||||
/* EMail: uz@cc65.org */
|
/* EMail: uz@cc65.org */
|
||||||
@@ -54,9 +54,10 @@
|
|||||||
#include "input.h"
|
#include "input.h"
|
||||||
#include "litpool.h"
|
#include "litpool.h"
|
||||||
#include "preproc.h"
|
#include "preproc.h"
|
||||||
|
#include "scanner.h"
|
||||||
|
#include "standard.h"
|
||||||
#include "symtab.h"
|
#include "symtab.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "scanner.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -72,63 +73,66 @@ Token NextTok; /* The next token */
|
|||||||
|
|
||||||
|
|
||||||
/* Token types */
|
/* Token types */
|
||||||
#define TT_C 0 /* ANSI C token */
|
enum {
|
||||||
#define TT_EXT 1 /* cc65 extension */
|
TT_C89 = 0x01 << STD_C89, /* Token valid in C89 */
|
||||||
|
TT_C99 = 0x01 << STD_C99, /* Token valid in C99 */
|
||||||
|
TT_CC65 = 0x01 << STD_CC65 /* Token valid in cc65 */
|
||||||
|
};
|
||||||
|
|
||||||
/* Token table */
|
/* Token table */
|
||||||
static const struct Keyword {
|
static const struct Keyword {
|
||||||
char* Key; /* Keyword name */
|
char* Key; /* Keyword name */
|
||||||
unsigned char Tok; /* The token */
|
unsigned char Tok; /* The token */
|
||||||
unsigned char Type; /* Token type */
|
unsigned char Std; /* Token supported in which standards? */
|
||||||
} Keywords [] = {
|
} Keywords [] = {
|
||||||
{ "_Pragma", TOK_PRAGMA, TT_C },
|
{ "_Pragma", TOK_PRAGMA, TT_C99 | TT_CC65 },
|
||||||
{ "__AX__", TOK_AX, TT_C },
|
{ "__AX__", TOK_AX, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "__A__", TOK_A, TT_C },
|
{ "__A__", TOK_A, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "__EAX__", TOK_EAX, TT_C },
|
{ "__EAX__", TOK_EAX, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "__X__", TOK_X, TT_C },
|
{ "__X__", TOK_X, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "__Y__", TOK_Y, TT_C },
|
{ "__Y__", TOK_Y, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "__asm__", TOK_ASM, TT_C },
|
{ "__asm__", TOK_ASM, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "__attribute__", TOK_ATTRIBUTE, TT_C },
|
{ "__attribute__", TOK_ATTRIBUTE, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "__far__", TOK_FAR, TT_C },
|
{ "__far__", TOK_FAR, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "__fastcall__", TOK_FASTCALL, TT_C },
|
{ "__fastcall__", TOK_FASTCALL, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "__near__", TOK_NEAR, TT_C },
|
{ "__near__", TOK_NEAR, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "asm", TOK_ASM, TT_EXT },
|
{ "asm", TOK_ASM, TT_CC65 },
|
||||||
{ "auto", TOK_AUTO, TT_C },
|
{ "auto", TOK_AUTO, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "break", TOK_BREAK, TT_C },
|
{ "break", TOK_BREAK, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "case", TOK_CASE, TT_C },
|
{ "case", TOK_CASE, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "char", TOK_CHAR, TT_C },
|
{ "char", TOK_CHAR, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "const", TOK_CONST, TT_C },
|
{ "const", TOK_CONST, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "continue", TOK_CONTINUE, TT_C },
|
{ "continue", TOK_CONTINUE, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "default", TOK_DEFAULT, TT_C },
|
{ "default", TOK_DEFAULT, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "do", TOK_DO, TT_C },
|
{ "do", TOK_DO, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "double", TOK_DOUBLE, TT_C },
|
{ "double", TOK_DOUBLE, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "else", TOK_ELSE, TT_C },
|
{ "else", TOK_ELSE, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "enum", TOK_ENUM, TT_C },
|
{ "enum", TOK_ENUM, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "extern", TOK_EXTERN, TT_C },
|
{ "extern", TOK_EXTERN, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "far", TOK_FAR, TT_EXT },
|
{ "far", TOK_FAR, TT_CC65 },
|
||||||
{ "fastcall", TOK_FASTCALL, TT_EXT },
|
{ "fastcall", TOK_FASTCALL, TT_CC65 },
|
||||||
{ "float", TOK_FLOAT, TT_C },
|
{ "float", TOK_FLOAT, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "for", TOK_FOR, TT_C },
|
{ "for", TOK_FOR, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "goto", TOK_GOTO, TT_C },
|
{ "goto", TOK_GOTO, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "if", TOK_IF, TT_C },
|
{ "if", TOK_IF, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "int", TOK_INT, TT_C },
|
{ "int", TOK_INT, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "long", TOK_LONG, TT_C },
|
{ "long", TOK_LONG, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "near", TOK_NEAR, TT_EXT },
|
{ "near", TOK_NEAR, TT_CC65 },
|
||||||
{ "register", TOK_REGISTER, TT_C },
|
{ "register", TOK_REGISTER, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "restrict", TOK_RESTRICT, TT_C },
|
{ "restrict", TOK_RESTRICT, TT_C99 | TT_CC65 },
|
||||||
{ "return", TOK_RETURN, TT_C },
|
{ "return", TOK_RETURN, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "short", TOK_SHORT, TT_C },
|
{ "short", TOK_SHORT, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "signed", TOK_SIGNED, TT_C },
|
{ "signed", TOK_SIGNED, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "sizeof", TOK_SIZEOF, TT_C },
|
{ "sizeof", TOK_SIZEOF, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "static", TOK_STATIC, TT_C },
|
{ "static", TOK_STATIC, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "struct", TOK_STRUCT, TT_C },
|
{ "struct", TOK_STRUCT, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "switch", TOK_SWITCH, TT_C },
|
{ "switch", TOK_SWITCH, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "typedef", TOK_TYPEDEF, TT_C },
|
{ "typedef", TOK_TYPEDEF, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "union", TOK_UNION, TT_C },
|
{ "union", TOK_UNION, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "unsigned", TOK_UNSIGNED, TT_C },
|
{ "unsigned", TOK_UNSIGNED, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "void", TOK_VOID, TT_C },
|
{ "void", TOK_VOID, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "volatile", TOK_VOLATILE, TT_C },
|
{ "volatile", TOK_VOLATILE, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
{ "while", TOK_WHILE, TT_C },
|
{ "while", TOK_WHILE, TT_C89 | TT_C99 | TT_CC65 },
|
||||||
};
|
};
|
||||||
#define KEY_COUNT (sizeof (Keywords) / sizeof (Keywords [0]))
|
#define KEY_COUNT (sizeof (Keywords) / sizeof (Keywords [0]))
|
||||||
|
|
||||||
@@ -143,7 +147,7 @@ static const struct Keyword {
|
|||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* code */
|
/* code */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
@@ -156,14 +160,14 @@ static int CmpKey (const void* Key, const void* Elem)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int FindKey (const char* Key)
|
static token_t FindKey (const char* Key)
|
||||||
/* Find a keyword and return the token. Return IDENT if the token is not a
|
/* Find a keyword and return the token. Return IDENT if the token is not a
|
||||||
* keyword.
|
* keyword.
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
struct Keyword* K;
|
struct Keyword* K;
|
||||||
K = bsearch (Key, Keywords, KEY_COUNT, sizeof (Keywords [0]), CmpKey);
|
K = bsearch (Key, Keywords, KEY_COUNT, sizeof (Keywords [0]), CmpKey);
|
||||||
if (K && (K->Type != TT_EXT || ANSI == 0)) {
|
if (K && (K->Std & (0x01 << IS_Get (&Standard))) != 0) {
|
||||||
return K->Tok;
|
return K->Tok;
|
||||||
} else {
|
} else {
|
||||||
return TOK_IDENT;
|
return TOK_IDENT;
|
||||||
@@ -262,7 +266,7 @@ static int ParseChar (void)
|
|||||||
C = '\b';
|
C = '\b';
|
||||||
break;
|
break;
|
||||||
case 'f':
|
case 'f':
|
||||||
C = '\f';
|
C = '\f';
|
||||||
break;
|
break;
|
||||||
case 'r':
|
case 'r':
|
||||||
C = '\r';
|
C = '\r';
|
||||||
@@ -315,7 +319,7 @@ static int ParseChar (void)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Error ("Illegal character constant");
|
Error ("Illegal character constant");
|
||||||
C = ' ';
|
C = ' ';
|
||||||
/* Try to do error recovery, otherwise the compiler will spit
|
/* Try to do error recovery, otherwise the compiler will spit
|
||||||
* out thousands of errors in this place and abort.
|
* out thousands of errors in this place and abort.
|
||||||
@@ -446,11 +450,12 @@ static void NumericConst (void)
|
|||||||
SB_Terminate (&S);
|
SB_Terminate (&S);
|
||||||
|
|
||||||
/* The following character tells us if we have an integer or floating
|
/* The following character tells us if we have an integer or floating
|
||||||
* point constant.
|
* point constant. Note: Hexadecimal floating point constants aren't
|
||||||
|
* supported in C89.
|
||||||
*/
|
*/
|
||||||
IsFloat = (CurC == '.' ||
|
IsFloat = (CurC == '.' ||
|
||||||
(Base == 10 && toupper (CurC) == 'E') ||
|
(Base == 10 && toupper (CurC) == 'E') ||
|
||||||
(Base == 16 && toupper (CurC) == 'P'));
|
(Base == 16 && toupper (CurC) == 'P' && IS_Get (&Standard) >= STD_C99));
|
||||||
|
|
||||||
/* If we don't have a floating point type, an octal prefix results in an
|
/* If we don't have a floating point type, an octal prefix results in an
|
||||||
* octal base.
|
* octal base.
|
||||||
@@ -702,18 +707,18 @@ void NextToken (void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* No reserved word, check for special symbols */
|
/* No reserved word, check for special symbols */
|
||||||
if (token [0] == '_') {
|
if (token[0] == '_' && token[1] == '_') {
|
||||||
/* Special symbols */
|
/* Special symbols */
|
||||||
if (strcmp (token, "__FILE__") == 0) {
|
if (strcmp (token+2, "FILE__") == 0) {
|
||||||
NextTok.IVal = AddLiteral (GetCurrentFile());
|
NextTok.IVal = AddLiteral (GetCurrentFile());
|
||||||
NextTok.Tok = TOK_SCONST;
|
NextTok.Tok = TOK_SCONST;
|
||||||
return;
|
return;
|
||||||
} else if (strcmp (token, "__LINE__") == 0) {
|
} else if (strcmp (token+2, "LINE__") == 0) {
|
||||||
NextTok.Tok = TOK_ICONST;
|
NextTok.Tok = TOK_ICONST;
|
||||||
NextTok.IVal = GetCurrentLine();
|
NextTok.IVal = GetCurrentLine();
|
||||||
NextTok.Type = type_int;
|
NextTok.Type = type_int;
|
||||||
return;
|
return;
|
||||||
} else if (strcmp (token, "__func__") == 0) {
|
} else if (strcmp (token+2, "func__") == 0) {
|
||||||
/* __func__ is only defined in functions */
|
/* __func__ is only defined in functions */
|
||||||
if (CurrentFunc) {
|
if (CurrentFunc) {
|
||||||
NextTok.IVal = AddLiteral (F_GetFuncName (CurrentFunc));
|
NextTok.IVal = AddLiteral (F_GetFuncName (CurrentFunc));
|
||||||
|
|||||||
84
src/cc65/standard.c
Normal file
84
src/cc65/standard.c
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
/*****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* standard.c */
|
||||||
|
/* */
|
||||||
|
/* Language standard definitions */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/* (C) 2004 Ullrich von Bassewitz */
|
||||||
|
/* R<>merstra<72>e 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. */
|
||||||
|
/* */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
/* cc65 */
|
||||||
|
#include "standard.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Data */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Current language standard, will be set to STD_DEFAULT on startup */
|
||||||
|
IntStack Standard = INTSTACK(STD_UNKNOWN);
|
||||||
|
|
||||||
|
/* Table mapping names to standards, sorted by standard. */
|
||||||
|
static const char* StdNames[STD_COUNT] = {
|
||||||
|
"c89", "c99", "cc65"
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Code */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
standard_t FindStandard (const char* Name)
|
||||||
|
/* Find a standard by name. Returns one of the constants defined above.
|
||||||
|
* STD_UNKNOWN is returned if Name doesn't match a standard.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
unsigned I;
|
||||||
|
|
||||||
|
/* Check for a standard string */
|
||||||
|
for (I = 0; I < STD_COUNT; ++I) {
|
||||||
|
if (strcmp (StdNames [I], Name) == 0) {
|
||||||
|
return (standard_t)I;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Not found */
|
||||||
|
return STD_UNKNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
88
src/cc65/standard.h
Normal file
88
src/cc65/standard.h
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
/*****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* standard.h */
|
||||||
|
/* */
|
||||||
|
/* Language standard definitions */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/* (C) 2004 Ullrich von Bassewitz */
|
||||||
|
/* R<>merstra<72>e 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. */
|
||||||
|
/* */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef STANDARD_H
|
||||||
|
#define STANDARD_H
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* common */
|
||||||
|
#include "intstack.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Data */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Supported standards. */
|
||||||
|
typedef enum standard_t {
|
||||||
|
STD_UNKNOWN = -1,
|
||||||
|
STD_C89,
|
||||||
|
STD_C99,
|
||||||
|
STD_CC65,
|
||||||
|
|
||||||
|
/* Special constants */
|
||||||
|
STD_COUNT, /* Number of supported standards */
|
||||||
|
STD_DEFAULT = STD_CC65 /* Default standard if none given */
|
||||||
|
} standard_t;
|
||||||
|
|
||||||
|
/* Current language standard */
|
||||||
|
extern IntStack Standard; /* Language standard */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Code */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
standard_t FindStandard (const char* Name);
|
||||||
|
/* Find a standard by name. Returns one of the constants defined above.
|
||||||
|
* STD_UNKNOWN is returned if Name doesn't match a standard.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* End of standard.h */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -603,7 +603,6 @@ static void Usage (void)
|
|||||||
" -t sys\t\tSet the target system\n"
|
" -t sys\t\tSet the target system\n"
|
||||||
" -v\t\t\tVerbose mode\n"
|
" -v\t\t\tVerbose mode\n"
|
||||||
" -vm\t\t\tVerbose map file\n"
|
" -vm\t\t\tVerbose map file\n"
|
||||||
" -A\t\t\tStrict ANSI mode\n"
|
|
||||||
" -C name\t\tUse linker config file\n"
|
" -C name\t\tUse linker config file\n"
|
||||||
" -Cl\t\t\tMake local variables static\n"
|
" -Cl\t\t\tMake local variables static\n"
|
||||||
" -D sym[=defn]\t\tDefine a preprocessor symbol\n"
|
" -D sym[=defn]\t\tDefine a preprocessor symbol\n"
|
||||||
@@ -621,7 +620,6 @@ static void Usage (void)
|
|||||||
"\n"
|
"\n"
|
||||||
"Long options:\n"
|
"Long options:\n"
|
||||||
" --add-source\t\tInclude source as comment\n"
|
" --add-source\t\tInclude source as comment\n"
|
||||||
" --ansi\t\tStrict ANSI mode\n"
|
|
||||||
" --asm-define sym[=v]\tDefine an assembler symbol\n"
|
" --asm-define sym[=v]\tDefine an assembler symbol\n"
|
||||||
" --asm-include-dir dir\tSet an assembler include directory\n"
|
" --asm-include-dir dir\tSet an assembler include directory\n"
|
||||||
" --bss-label name\tDefine and export a BSS segment label\n"
|
" --bss-label name\tDefine and export a BSS segment label\n"
|
||||||
@@ -658,6 +656,7 @@ static void Usage (void)
|
|||||||
" --register-vars\tEnable register variables\n"
|
" --register-vars\tEnable register variables\n"
|
||||||
" --rodata-name seg\tSet the name of the RODATA segment\n"
|
" --rodata-name seg\tSet the name of the RODATA segment\n"
|
||||||
" --signed-chars\tDefault characters are signed\n"
|
" --signed-chars\tDefault characters are signed\n"
|
||||||
|
" --standard std\tLanguage standard (c89, c99, cc65)\n"
|
||||||
" --start-addr addr\tSet the default start address\n"
|
" --start-addr addr\tSet the default start address\n"
|
||||||
" --static-locals\tMake local variables static\n"
|
" --static-locals\tMake local variables static\n"
|
||||||
" --target sys\t\tSet the target system\n"
|
" --target sys\t\tSet the target system\n"
|
||||||
@@ -679,15 +678,6 @@ static void OptAddSource (const char* Opt attribute ((unused)),
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void OptAnsi (const char* Opt attribute ((unused)),
|
|
||||||
const char* Arg attribute ((unused)))
|
|
||||||
/* Strict ANSI mode (compiler) */
|
|
||||||
{
|
|
||||||
CmdAddArg (&CC65, "-A");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void OptAsmDefine (const char* Opt attribute ((unused)), const char* Arg)
|
static void OptAsmDefine (const char* Opt attribute ((unused)), const char* Arg)
|
||||||
/* Define an assembler symbol (assembler) */
|
/* Define an assembler symbol (assembler) */
|
||||||
{
|
{
|
||||||
@@ -1017,6 +1007,14 @@ static void OptSignedChars (const char* Opt attribute ((unused)),
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void OptStandard (const char* Opt attribute ((unused)), const char* Arg)
|
||||||
|
/* Set the language standard */
|
||||||
|
{
|
||||||
|
CmdAddArg2 (&CC65, "--standard", Arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void OptStartAddr (const char* Opt attribute ((unused)), const char* Arg)
|
static void OptStartAddr (const char* Opt attribute ((unused)), const char* Arg)
|
||||||
/* Set the default start address */
|
/* Set the default start address */
|
||||||
{
|
{
|
||||||
@@ -1092,7 +1090,6 @@ int main (int argc, char* argv [])
|
|||||||
/* Program long options */
|
/* Program long options */
|
||||||
static const LongOpt OptTab[] = {
|
static const LongOpt OptTab[] = {
|
||||||
{ "--add-source", 0, OptAddSource },
|
{ "--add-source", 0, OptAddSource },
|
||||||
{ "--ansi", 0, OptAnsi },
|
|
||||||
{ "--asm-define", 1, OptAsmDefine },
|
{ "--asm-define", 1, OptAsmDefine },
|
||||||
{ "--asm-include-dir", 1, OptAsmIncludeDir },
|
{ "--asm-include-dir", 1, OptAsmIncludeDir },
|
||||||
{ "--bss-label", 1, OptBssLabel },
|
{ "--bss-label", 1, OptBssLabel },
|
||||||
@@ -1129,6 +1126,7 @@ int main (int argc, char* argv [])
|
|||||||
{ "--register-vars", 0, OptRegisterVars },
|
{ "--register-vars", 0, OptRegisterVars },
|
||||||
{ "--rodata-name", 1, OptRodataName },
|
{ "--rodata-name", 1, OptRodataName },
|
||||||
{ "--signed-chars", 0, OptSignedChars },
|
{ "--signed-chars", 0, OptSignedChars },
|
||||||
|
{ "--standard", 1, OptStandard },
|
||||||
{ "--start-addr", 1, OptStartAddr },
|
{ "--start-addr", 1, OptStartAddr },
|
||||||
{ "--static-locals", 0, OptStaticLocals },
|
{ "--static-locals", 0, OptStaticLocals },
|
||||||
{ "--target", 1, OptTarget },
|
{ "--target", 1, OptTarget },
|
||||||
@@ -1169,11 +1167,6 @@ int main (int argc, char* argv [])
|
|||||||
LongOption (&I, OptTab, sizeof(OptTab)/sizeof(OptTab[0]));
|
LongOption (&I, OptTab, sizeof(OptTab)/sizeof(OptTab[0]));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'A':
|
|
||||||
/* Strict ANSI mode (compiler) */
|
|
||||||
OptAnsi (Arg, 0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'C':
|
case 'C':
|
||||||
if (Arg[2] == 'l' && Arg[3] == '\0') {
|
if (Arg[2] == 'l' && Arg[3] == '\0') {
|
||||||
/* Make local variables static */
|
/* Make local variables static */
|
||||||
|
|||||||
Reference in New Issue
Block a user