+#include <string.h>
+
/* common */
+#include "check.h"
#include "exprdefs.h"
+#include "print.h"
+#include "tgttrans.h"
#include "xmalloc.h"
/* ca65 */
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]);
}
switch (Tok) {
case TOK_INTCON:
- case TOK_CHARCON:
N = LiteralExpr (IVal);
NextTok ();
break;
+ case TOK_CHARCON:
+ N = LiteralExpr (TgtTranslateChar (IVal));
+ NextTok ();
+ break;
+
case TOK_NAMESPACE:
NextTok ();
if (Tok != TOK_IDENT) {
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;
}
case EXPR_SYMBOL:
Sym = Root->V.Sym;
if (SymHasUserMark (Sym)) {
- if (Verbose) {
+ if (Verbosity > 0) {
DumpExpr (Root);
}
PError (GetSymPos (Sym), ERR_CIRCULAR_REFERENCE);
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:
SymEntry* Sym = Expr->V.Sym;
if (SymHasUserMark (Sym)) {
/* Circular definition */
- if (Verbose) {
+ if (Verbosity) {
DumpExpr (Expr);
}
PError (GetSymPos (Sym), ERR_CIRCULAR_REFERENCE);