mirror of
https://github.com/cc65/cc65.git
synced 2024-11-18 00:07:21 +00:00
Added a .IDENT function
git-svn-id: svn://svn.cc65.org/cc65/trunk@3506 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
480b61e0bf
commit
76d94bc8d9
@ -42,6 +42,7 @@
|
|||||||
/* ca65 */
|
/* ca65 */
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "expr.h"
|
#include "expr.h"
|
||||||
|
#include "global.h"
|
||||||
#include "scanner.h"
|
#include "scanner.h"
|
||||||
#include "toklist.h"
|
#include "toklist.h"
|
||||||
#include "nexttok.h"
|
#include "nexttok.h"
|
||||||
@ -223,6 +224,86 @@ static void FuncLeft (void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void NoIdent (void)
|
||||||
|
/* Print an error message and skip the remainder of the line */
|
||||||
|
{
|
||||||
|
Error ("Argument of .IDENT is not a valid identifier");
|
||||||
|
SkipUntilSep ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void FuncIdent (void)
|
||||||
|
/* Handle the .IDENT function */
|
||||||
|
{
|
||||||
|
char Buf[sizeof(SVal)];
|
||||||
|
enum Token Id;
|
||||||
|
unsigned Len;
|
||||||
|
unsigned I;
|
||||||
|
|
||||||
|
/* Skip it */
|
||||||
|
NextTok ();
|
||||||
|
|
||||||
|
/* Left paren expected */
|
||||||
|
ConsumeLParen ();
|
||||||
|
|
||||||
|
/* The function expects a string argument */
|
||||||
|
if (Tok != TOK_STRCON) {
|
||||||
|
Error ("String constant expected");
|
||||||
|
SkipUntilSep ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check that the string contains a valid identifier. While doing so,
|
||||||
|
* determine if it is a cheap local, or global one.
|
||||||
|
*/
|
||||||
|
Len = strlen (SVal);
|
||||||
|
if (Len == 0) {
|
||||||
|
NoIdent ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
I = 0;
|
||||||
|
if (SVal[0] == LocalStart) {
|
||||||
|
if (Len < 2) {
|
||||||
|
NoIdent ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
I = 1;
|
||||||
|
Id = TOK_LOCAL_IDENT;
|
||||||
|
} else {
|
||||||
|
Id = TOK_IDENT;
|
||||||
|
}
|
||||||
|
if (!IsIdStart (SVal[I])) {
|
||||||
|
NoIdent ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
while (I < Len) {
|
||||||
|
if (!IsIdChar (SVal[I])) {
|
||||||
|
NoIdent ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
++I;
|
||||||
|
}
|
||||||
|
if (IgnoreCase) {
|
||||||
|
UpcaseSVal ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If anything is ok, save and skip the string. Check that the next token
|
||||||
|
* is a right paren, in which case SVal is untouched. Replace the token by
|
||||||
|
* a identifier token.
|
||||||
|
*/
|
||||||
|
memcpy (Buf, SVal, Len+1);
|
||||||
|
NextTok ();
|
||||||
|
if (Tok != TOK_RPAREN) {
|
||||||
|
Error ("`)' expected");
|
||||||
|
} else {
|
||||||
|
Tok = Id;
|
||||||
|
memcpy (SVal, Buf, Len+1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void FuncMid (void)
|
static void FuncMid (void)
|
||||||
/* Handle the .MID function */
|
/* Handle the .MID function */
|
||||||
{
|
{
|
||||||
@ -384,6 +465,10 @@ void NextTok (void)
|
|||||||
FuncLeft ();
|
FuncLeft ();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TOK_MAKEIDENT:
|
||||||
|
FuncIdent ();
|
||||||
|
break;
|
||||||
|
|
||||||
case TOK_MID:
|
case TOK_MID:
|
||||||
FuncMid ();
|
FuncMid ();
|
||||||
break;
|
break;
|
||||||
|
@ -1720,6 +1720,7 @@ static CtrlDesc CtrlCmdTab [] = {
|
|||||||
{ ccNone, DoUnexpected }, /* .HIWORD */
|
{ ccNone, DoUnexpected }, /* .HIWORD */
|
||||||
{ ccNone, DoI16 },
|
{ ccNone, DoI16 },
|
||||||
{ ccNone, DoI8 },
|
{ ccNone, DoI8 },
|
||||||
|
{ ccNone, DoUnexpected }, /* .IDENT */
|
||||||
{ ccKeepToken, DoConditionals }, /* .IF */
|
{ ccKeepToken, DoConditionals }, /* .IF */
|
||||||
{ ccKeepToken, DoConditionals }, /* .IFBLANK */
|
{ ccKeepToken, DoConditionals }, /* .IFBLANK */
|
||||||
{ ccKeepToken, DoConditionals }, /* .IFCONST */
|
{ ccKeepToken, DoConditionals }, /* .IFCONST */
|
||||||
|
@ -179,6 +179,7 @@ struct DotKeyword {
|
|||||||
{ ".HIWORD", TOK_HIWORD },
|
{ ".HIWORD", TOK_HIWORD },
|
||||||
{ ".I16", TOK_I16 },
|
{ ".I16", TOK_I16 },
|
||||||
{ ".I8", TOK_I8 },
|
{ ".I8", TOK_I8 },
|
||||||
|
{ ".IDENT", TOK_MAKEIDENT },
|
||||||
{ ".IF", TOK_IF },
|
{ ".IF", TOK_IF },
|
||||||
{ ".IFBLANK", TOK_IFBLANK },
|
{ ".IFBLANK", TOK_IFBLANK },
|
||||||
{ ".IFCONST", TOK_IFCONST },
|
{ ".IFCONST", TOK_IFCONST },
|
||||||
@ -276,7 +277,7 @@ static void NextChar (void);
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int IsIdChar (int C)
|
int IsIdChar (int C)
|
||||||
/* Return true if the character is a valid character for an identifier */
|
/* Return true if the character is a valid character for an identifier */
|
||||||
{
|
{
|
||||||
return IsAlNum (C) ||
|
return IsAlNum (C) ||
|
||||||
@ -287,7 +288,7 @@ static int IsIdChar (int C)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int IsIdStart (int C)
|
int IsIdStart (int C)
|
||||||
/* Return true if the character may start an identifier */
|
/* Return true if the character may start an identifier */
|
||||||
{
|
{
|
||||||
return IsAlpha (C) || C == '_';
|
return IsAlpha (C) || C == '_';
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 1998-2004 Ullrich von Bassewitz */
|
/* (C) 1998-2005 Ullrich von Bassewitz */
|
||||||
/* Römerstraße 52 */
|
/* Römerstraße 52 */
|
||||||
/* D-70794 Filderstadt */
|
/* D-70794 Filderstadt */
|
||||||
/* EMail: uz@cc65.org */
|
/* EMail: uz@cc65.org */
|
||||||
@ -174,6 +174,7 @@ enum Token {
|
|||||||
TOK_HIWORD,
|
TOK_HIWORD,
|
||||||
TOK_I16,
|
TOK_I16,
|
||||||
TOK_I8,
|
TOK_I8,
|
||||||
|
TOK_MAKEIDENT,
|
||||||
TOK_IF,
|
TOK_IF,
|
||||||
TOK_IFBLANK,
|
TOK_IFBLANK,
|
||||||
TOK_IFCONST,
|
TOK_IFCONST,
|
||||||
@ -267,6 +268,12 @@ extern int ForcedEnd; /* Force end of assembly */
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int IsIdChar (int C);
|
||||||
|
/* Return true if the character is a valid character for an identifier */
|
||||||
|
|
||||||
|
int IsIdStart (int C);
|
||||||
|
/* Return true if the character may start an identifier */
|
||||||
|
|
||||||
void NewInputFile (const char* Name);
|
void NewInputFile (const char* Name);
|
||||||
/* Open a new input file */
|
/* Open a new input file */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user