1
0
mirror of https://github.com/cc65/cc65.git synced 2024-09-28 10:55:43 +00:00

Allow optional assignments in .export and .exportzp statements.

git-svn-id: svn://svn.cc65.org/cc65/trunk@3809 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz 2008-02-19 21:01:07 +00:00
parent b582ad7ed1
commit 94f3a578a5
2 changed files with 46 additions and 10 deletions

View File

@ -2158,19 +2158,25 @@ Here's a list of all control commands and a description, what they do:
<sect1><tt>.EXPORT</tt><label id=".EXPORT"><p>
Make symbols accessible from other modules. Must be followed by a comma
separated list of symbols to export, with each one optionally followed by
an address specification. The default is to export the symbol with the
address size it actually has. The assembler will issue a warning, if the
symbol is exported with an address size smaller than the actual address
size.
separated list of symbols to export, with each one optionally followed by an
address specification and (also optional) an assignment. Using an additional
assignment in the export statement allows to define and export a symbol in
one statement. The default is to export the symbol with the address size it
actually has. The assembler will issue a warning, if the symbol is exported
with an address size smaller than the actual address size.
Example:
Examples:
<tscreen><verb>
.export foo
.export bar: far
.export foobar: far = foo * bar
.export baz := foobar, zap: far = baz - bar
</verb></tscreen>
As with constant definitions, using <tt/:=/ instead of <tt/=/ marks the
symbols as a label.
See: <tt><ref id=".EXPORTZP" name=".EXPORTZP"></tt>
@ -2178,12 +2184,15 @@ Here's a list of all control commands and a description, what they do:
Make symbols accessible from other modules. Must be followed by a comma
separated list of symbols to export. The exported symbols are explicitly
marked as zero page symbols.
marked as zero page symbols. An assignment may be included in the
<tt/.EXPORTZP/ statement. This allows to define and export a symbol in one
statement.
Example:
Examples:
<tscreen><verb>
.exportzp foo, bar
.exportzp baz := &dollar;02
</verb></tscreen>
See: <tt><ref id=".EXPORT" name=".EXPORT"></tt>

View File

@ -165,6 +165,33 @@ static void SetBoolOption (unsigned char* Flag)
static void ExportWithAssign (SymEntry* Sym, unsigned char AddrSize, unsigned Flags)
/* Allow to assign the value of an export in an .export statement */
{
/* The name and optional address size spec may be followed by an assignment
* or equal token.
*/
if (Tok == TOK_ASSIGN || Tok == TOK_EQ) {
/* Assignment means the symbol is a label */
if (Tok == TOK_ASSIGN) {
Flags |= SF_LABEL;
}
/* Skip the assignment token */
NextTok ();
/* Define the symbol with the expression following the '=' */
SymDef (Sym, Expression(), ADDR_SIZE_DEFAULT, Flags);
}
/* Now export the symbol */
SymExport (Sym, AddrSize, Flags);
}
static void ExportImport (void (*Func) (SymEntry*, unsigned char, unsigned),
unsigned char DefAddrSize, unsigned Flags)
/* Export or import symbols */
@ -782,7 +809,7 @@ static void DoExitMacro (void)
static void DoExport (void)
/* Export a symbol */
{
ExportImport (SymExport, ADDR_SIZE_DEFAULT, SF_NONE);
ExportImport (ExportWithAssign, ADDR_SIZE_DEFAULT, SF_NONE);
}
@ -790,7 +817,7 @@ static void DoExport (void)
static void DoExportZP (void)
/* Export a zeropage symbol */
{
ExportImport (SymExport, ADDR_SIZE_ZP, SF_NONE);
ExportImport (ExportWithAssign, ADDR_SIZE_ZP, SF_NONE);
}