1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-15 17:30:06 +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:
cuz 2000-07-25 21:32:11 +00:00
parent 5ee142c7c2
commit 62abe29353
4 changed files with 97 additions and 18 deletions

View File

@ -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 */
{
@ -492,7 +557,7 @@ static int FuncTCount (void)
switch (Tok) {
case TOK_LPAREN: ++Parens; break;
case TOK_RPAREN: --Parens; break;
default: break;
default: break;
}
/* Skip the token */
@ -547,10 +612,10 @@ static ExprNode* Factor (void)
SymEntry* S;
switch (Tok) {
case TOK_INTCON:
case TOK_CHARCON:
N = LiteralExpr (IVal);
N = LiteralExpr (IVal);
NextTok ();
break;
@ -568,7 +633,7 @@ static ExprNode* Factor (void)
/* Create symbol node */
N = NewExprNode ();
N->Op = EXPR_SYMBOL;
N->V.Sym = S;
N->V.Sym = S;
}
NextTok ();
}
@ -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;

View File

@ -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 },

View File

@ -192,7 +192,7 @@ struct DotKeyword {
{ "LOCALCHAR", TOK_LOCALCHAR },
{ "MAC", TOK_MACRO },
{ "MACPACK", TOK_MACPACK },
{ "MACRO", TOK_MACRO },
{ "MACRO", TOK_MACRO },
{ "MATCH", TOK_MATCH },
{ "MID", TOK_MID },
{ "MOD", TOK_MOD },
@ -213,19 +213,21 @@ struct DotKeyword {
{ "RELOC", TOK_RELOC },
{ "REPEAT", TOK_REPEAT },
{ "RES", TOK_RES },
{ "RIGHT", TOK_RIGHT },
{ "RODATA", TOK_RODATA },
{ "SEGMENT", TOK_SEGMENT },
{ "SHL", TOK_SHL },
{ "SHR", TOK_SHR },
{ "SMART", TOK_SMART },
{ "STRING", TOK_STRING },
{ "SUNPLUS", TOK_SUNPLUS },
{ "TCOUNT", TOK_TCOUNT },
{ "WORD", TOK_WORD },
{ "XMATCH", TOK_XMATCH },
{ "XOR", TOK_BXOR },
{ "ZEROPAGE", TOK_ZEROPAGE },
{ "RIGHT", TOK_RIGHT },
{ "RODATA", TOK_RODATA },
{ "SEGMENT", TOK_SEGMENT },
{ "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 },
{ "XMATCH", TOK_XMATCH },
{ "XOR", TOK_BXOR },
{ "ZEROPAGE", TOK_ZEROPAGE },
};

View File

@ -188,7 +188,9 @@ enum Token {
TOK_RODATA,
TOK_SEGMENT,
TOK_SMART,
TOK_STRAT,
TOK_STRING,
TOK_STRLEN,
TOK_SUNPLUS,
TOK_TCOUNT,
TOK_WORD,