X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fca65%2Fexpr.c;h=497a6143abbece80766303dd70af328eb520dd0f;hb=46209118b1a77d2e57f28026b1e5916c2c074778;hp=ba31178571868a95ad86c54dc69197a664ecb843;hpb=c77d0dea94a33f1d035645f266782c5029837f32;p=cc65 diff --git a/src/ca65/expr.c b/src/ca65/expr.c index ba3117857..497a6143a 100644 --- a/src/ca65/expr.c +++ b/src/ca65/expr.c @@ -33,9 +33,13 @@ +#include + /* common */ #include "check.h" #include "exprdefs.h" +#include "print.h" +#include "tgttrans.h" #include "xmalloc.h" /* ca65 */ @@ -46,7 +50,6 @@ #include "objcode.h" #include "objfile.h" #include "symtab.h" -#include "target.h" #include "toklist.h" #include "ulabel.h" #include "expr.h" @@ -357,13 +360,15 @@ static int FuncStrAt (void) Index = ConstExpression (); /* Must be a valid index */ - if (Index >= strlen (Str)) { + if (Index >= (long) strlen (Str)) { Error (ERR_RANGE); return 0; } - /* Return the char, handle as unsigned */ - return (unsigned char) Str[(size_t)Index]; + /* Return the char, handle as unsigned. Be sure to translate it into + * the target character set. + */ + return (unsigned char) TgtTranslateChar (Str [(size_t)Index]); } @@ -484,7 +489,7 @@ static ExprNode* Factor (void) break; case TOK_CHARCON: - N = LiteralExpr ((unsigned char) XlatChar ((char)IVal)); + N = LiteralExpr (TgtTranslateChar (IVal)); NextTok (); break; @@ -609,8 +614,13 @@ static ExprNode* Factor (void) break; default: - N = LiteralExpr (0); /* Dummy */ - Error (ERR_SYNTAX); + if (LooseCharTerm && Tok == TOK_STRCON && strlen(SVal) == 1) { + /* A character constant */ + N = LiteralExpr (TgtTranslateChar (SVal[0])); + } else { + N = LiteralExpr (0); /* Dummy */ + Error (ERR_SYNTAX); + } NextTok (); break; } @@ -1027,7 +1037,7 @@ int IsConstExpr (ExprNode* Root) case EXPR_SYMBOL: Sym = Root->V.Sym; if (SymHasUserMark (Sym)) { - if (Verbose) { + if (Verbosity > 0) { DumpExpr (Root); } PError (GetSymPos (Sym), ERR_CIRCULAR_REFERENCE); @@ -1100,10 +1110,13 @@ static void CheckByteExpr (const ExprNode* N, int* IsByte) case EXPR_LEAFNODE: switch (N->Op) { - case EXPR_SYMBOL: - if (SymIsZP (N->V.Sym)) { - *IsByte = 1; - } + case EXPR_SYMBOL: + if (SymIsZP (N->V.Sym)) { + *IsByte = 1; + } else if (SymHasExpr (N->V.Sym)) { + /* Check if this expression is a byte expression */ + *IsByte = IsByteExpr (GetSymExpr (N->V.Sym)); + } break; case EXPR_SEGMENT: @@ -1299,7 +1312,7 @@ static ExprNode* RemoveSyms (ExprNode* Expr, int MustClone) SymEntry* Sym = Expr->V.Sym; if (SymHasUserMark (Sym)) { /* Circular definition */ - if (Verbose) { + if (Verbosity) { DumpExpr (Expr); } PError (GetSymPos (Sym), ERR_CIRCULAR_REFERENCE);