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:
@@ -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)
|
static int FuncTCount (void)
|
||||||
/* Handle the .TCOUNT function */
|
/* Handle the .TCOUNT function */
|
||||||
{
|
{
|
||||||
@@ -492,7 +557,7 @@ static int FuncTCount (void)
|
|||||||
switch (Tok) {
|
switch (Tok) {
|
||||||
case TOK_LPAREN: ++Parens; break;
|
case TOK_LPAREN: ++Parens; break;
|
||||||
case TOK_RPAREN: --Parens; break;
|
case TOK_RPAREN: --Parens; break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Skip the token */
|
/* Skip the token */
|
||||||
@@ -547,10 +612,10 @@ static ExprNode* Factor (void)
|
|||||||
SymEntry* S;
|
SymEntry* S;
|
||||||
|
|
||||||
switch (Tok) {
|
switch (Tok) {
|
||||||
|
|
||||||
case TOK_INTCON:
|
case TOK_INTCON:
|
||||||
case TOK_CHARCON:
|
case TOK_CHARCON:
|
||||||
N = LiteralExpr (IVal);
|
N = LiteralExpr (IVal);
|
||||||
NextTok ();
|
NextTok ();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -568,7 +633,7 @@ static ExprNode* Factor (void)
|
|||||||
/* Create symbol node */
|
/* Create symbol node */
|
||||||
N = NewExprNode ();
|
N = NewExprNode ();
|
||||||
N->Op = EXPR_SYMBOL;
|
N->Op = EXPR_SYMBOL;
|
||||||
N->V.Sym = S;
|
N->V.Sym = S;
|
||||||
}
|
}
|
||||||
NextTok ();
|
NextTok ();
|
||||||
}
|
}
|
||||||
@@ -658,6 +723,14 @@ static ExprNode* Factor (void)
|
|||||||
N = Function (FuncReferenced);
|
N = Function (FuncReferenced);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case TOK_STRAT:
|
||||||
|
N = Function (FuncStrAt);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TOK_STRLEN:
|
||||||
|
N = Function (FuncStrLen);
|
||||||
|
break;
|
||||||
|
|
||||||
case TOK_TCOUNT:
|
case TOK_TCOUNT:
|
||||||
N = Function (FuncTCount);
|
N = Function (FuncTCount);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -1162,7 +1162,9 @@ static CtrlDesc CtrlCmdTab [] = {
|
|||||||
{ ccNone, DoROData },
|
{ ccNone, DoROData },
|
||||||
{ ccNone, DoSegment },
|
{ ccNone, DoSegment },
|
||||||
{ ccNone, DoSmart },
|
{ ccNone, DoSmart },
|
||||||
|
{ ccNone, DoUnexpected }, /* .STRAT */
|
||||||
{ ccNone, DoUnexpected }, /* .STRING */
|
{ ccNone, DoUnexpected }, /* .STRING */
|
||||||
|
{ ccNone, DoUnexpected }, /* .STRLEN */
|
||||||
{ ccNone, DoSunPlus },
|
{ ccNone, DoSunPlus },
|
||||||
{ ccNone, DoUnexpected }, /* .TCOUNT */
|
{ ccNone, DoUnexpected }, /* .TCOUNT */
|
||||||
{ ccNone, DoWord },
|
{ ccNone, DoWord },
|
||||||
|
|||||||
@@ -192,7 +192,7 @@ struct DotKeyword {
|
|||||||
{ "LOCALCHAR", TOK_LOCALCHAR },
|
{ "LOCALCHAR", TOK_LOCALCHAR },
|
||||||
{ "MAC", TOK_MACRO },
|
{ "MAC", TOK_MACRO },
|
||||||
{ "MACPACK", TOK_MACPACK },
|
{ "MACPACK", TOK_MACPACK },
|
||||||
{ "MACRO", TOK_MACRO },
|
{ "MACRO", TOK_MACRO },
|
||||||
{ "MATCH", TOK_MATCH },
|
{ "MATCH", TOK_MATCH },
|
||||||
{ "MID", TOK_MID },
|
{ "MID", TOK_MID },
|
||||||
{ "MOD", TOK_MOD },
|
{ "MOD", TOK_MOD },
|
||||||
@@ -213,19 +213,21 @@ struct DotKeyword {
|
|||||||
{ "RELOC", TOK_RELOC },
|
{ "RELOC", TOK_RELOC },
|
||||||
{ "REPEAT", TOK_REPEAT },
|
{ "REPEAT", TOK_REPEAT },
|
||||||
{ "RES", TOK_RES },
|
{ "RES", TOK_RES },
|
||||||
{ "RIGHT", TOK_RIGHT },
|
{ "RIGHT", TOK_RIGHT },
|
||||||
{ "RODATA", TOK_RODATA },
|
{ "RODATA", TOK_RODATA },
|
||||||
{ "SEGMENT", TOK_SEGMENT },
|
{ "SEGMENT", TOK_SEGMENT },
|
||||||
{ "SHL", TOK_SHL },
|
{ "SHL", TOK_SHL },
|
||||||
{ "SHR", TOK_SHR },
|
{ "SHR", TOK_SHR },
|
||||||
{ "SMART", TOK_SMART },
|
{ "SMART", TOK_SMART },
|
||||||
{ "STRING", TOK_STRING },
|
{ "STRAT", TOK_STRAT },
|
||||||
{ "SUNPLUS", TOK_SUNPLUS },
|
{ "STRING", TOK_STRING },
|
||||||
{ "TCOUNT", TOK_TCOUNT },
|
{ "STRLEN", TOK_STRLEN },
|
||||||
{ "WORD", TOK_WORD },
|
{ "SUNPLUS", TOK_SUNPLUS },
|
||||||
{ "XMATCH", TOK_XMATCH },
|
{ "TCOUNT", TOK_TCOUNT },
|
||||||
{ "XOR", TOK_BXOR },
|
{ "WORD", TOK_WORD },
|
||||||
{ "ZEROPAGE", TOK_ZEROPAGE },
|
{ "XMATCH", TOK_XMATCH },
|
||||||
|
{ "XOR", TOK_BXOR },
|
||||||
|
{ "ZEROPAGE", TOK_ZEROPAGE },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -188,7 +188,9 @@ enum Token {
|
|||||||
TOK_RODATA,
|
TOK_RODATA,
|
||||||
TOK_SEGMENT,
|
TOK_SEGMENT,
|
||||||
TOK_SMART,
|
TOK_SMART,
|
||||||
|
TOK_STRAT,
|
||||||
TOK_STRING,
|
TOK_STRING,
|
||||||
|
TOK_STRLEN,
|
||||||
TOK_SUNPLUS,
|
TOK_SUNPLUS,
|
||||||
TOK_TCOUNT,
|
TOK_TCOUNT,
|
||||||
TOK_WORD,
|
TOK_WORD,
|
||||||
|
|||||||
Reference in New Issue
Block a user