mirror of
https://github.com/cc65/cc65.git
synced 2025-01-12 17:30:50 +00:00
Added string handling functions: .STRLEN and .STRAT
git-svn-id: svn://svn.cc65.org/cc65/trunk@199 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
5ee142c7c2
commit
62abe29353
@ -467,6 +467,71 @@ static int FuncReferenced (void)
|
||||
|
||||
|
||||
|
||||
static int FuncStrAt (void)
|
||||
/* Handle the .STRAT function */
|
||||
{
|
||||
char Str [sizeof(SVal)];
|
||||
long Index;
|
||||
|
||||
/* String constant expected */
|
||||
if (Tok != TOK_STRCON) {
|
||||
Error (ERR_STRCON_EXPECTED);
|
||||
NextTok ();
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
/* Remember the string and skip it */
|
||||
strcpy (Str, SVal);
|
||||
NextTok ();
|
||||
|
||||
/* Comma must follow */
|
||||
ConsumeComma ();
|
||||
|
||||
/* Expression expected */
|
||||
Index = ConstExpression ();
|
||||
|
||||
/* Must be a valid index */
|
||||
if (Index >= strlen (Str)) {
|
||||
Error (ERR_RANGE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Return the char, handle as unsigned */
|
||||
return (unsigned char) Str[(size_t)Index];
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int FuncStrLen (void)
|
||||
/* Handle the .STRLEN function */
|
||||
{
|
||||
/* String constant expected */
|
||||
if (Tok != TOK_STRCON) {
|
||||
|
||||
Error (ERR_STRCON_EXPECTED);
|
||||
/* Smart error recovery */
|
||||
if (Tok != TOK_RPAREN) {
|
||||
NextTok ();
|
||||
}
|
||||
return 0;
|
||||
|
||||
} else {
|
||||
|
||||
/* Get the length of the string */
|
||||
int Len = strlen (SVal);
|
||||
|
||||
/* Skip the string */
|
||||
NextTok ();
|
||||
|
||||
/* Return the length */
|
||||
return Len;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int FuncTCount (void)
|
||||
/* Handle the .TCOUNT function */
|
||||
{
|
||||
@ -658,6 +723,14 @@ static ExprNode* Factor (void)
|
||||
N = Function (FuncReferenced);
|
||||
break;
|
||||
|
||||
case TOK_STRAT:
|
||||
N = Function (FuncStrAt);
|
||||
break;
|
||||
|
||||
case TOK_STRLEN:
|
||||
N = Function (FuncStrLen);
|
||||
break;
|
||||
|
||||
case TOK_TCOUNT:
|
||||
N = Function (FuncTCount);
|
||||
break;
|
||||
|
@ -1162,7 +1162,9 @@ static CtrlDesc CtrlCmdTab [] = {
|
||||
{ ccNone, DoROData },
|
||||
{ ccNone, DoSegment },
|
||||
{ ccNone, DoSmart },
|
||||
{ ccNone, DoUnexpected }, /* .STRAT */
|
||||
{ ccNone, DoUnexpected }, /* .STRING */
|
||||
{ ccNone, DoUnexpected }, /* .STRLEN */
|
||||
{ ccNone, DoSunPlus },
|
||||
{ ccNone, DoUnexpected }, /* .TCOUNT */
|
||||
{ ccNone, DoWord },
|
||||
|
@ -219,7 +219,9 @@ struct DotKeyword {
|
||||
{ "SHL", TOK_SHL },
|
||||
{ "SHR", TOK_SHR },
|
||||
{ "SMART", TOK_SMART },
|
||||
{ "STRAT", TOK_STRAT },
|
||||
{ "STRING", TOK_STRING },
|
||||
{ "STRLEN", TOK_STRLEN },
|
||||
{ "SUNPLUS", TOK_SUNPLUS },
|
||||
{ "TCOUNT", TOK_TCOUNT },
|
||||
{ "WORD", TOK_WORD },
|
||||
|
@ -188,7 +188,9 @@ enum Token {
|
||||
TOK_RODATA,
|
||||
TOK_SEGMENT,
|
||||
TOK_SMART,
|
||||
TOK_STRAT,
|
||||
TOK_STRING,
|
||||
TOK_STRLEN,
|
||||
TOK_SUNPLUS,
|
||||
TOK_TCOUNT,
|
||||
TOK_WORD,
|
||||
|
Loading…
x
Reference in New Issue
Block a user