/* */
/* */
/* */
-/* (C) 2000-2003 Ullrich von Bassewitz */
-/* Römerstraße 52 */
-/* D-70794 Filderstadt */
-/* EMail: uz@cc65.org */
+/* (C) 2000-2011, Ullrich von Bassewitz */
+/* Roemerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
/* Initialize elements */
ID->Flags = NeedTerm? ifNeedTerm : ifNone;
- ID->Pos = CurPos;
+ ID->Pos = CurTok.Pos;
ID->Name = Directive;
/* Return the result */
static void FreeIf (void)
/* Free all .IF descriptors until we reach one with the NeedTerm bit set */
{
- int Done = 0;
+ int Done;
do {
IfDesc* D = GetCurrentIf();
if (D == 0) {
/*****************************************************************************/
-/* Code */
+/* Code */
/*****************************************************************************/
int IfCond = GetCurrentIfCond ();
do {
- switch (Tok) {
+ switch (CurTok.Tok) {
case TOK_ELSE:
D = GetCurrentIf ();
if (D == 0) {
- Error ("Unexpected .ELSE");
+ Error ("Unexpected .ELSE");
} else if (GetElse(D)) {
/* We already had a .ELSE ! */
Error ("Duplicate .ELSE");
/* Allow an .ELSE */
InvertIfCond (D);
SetElse (D, 1);
- D->Pos = CurPos;
+ D->Pos = CurTok.Pos;
D->Name = ".ELSE";
IfCond = GetCurrentIfCond ();
}
NextTok ();
+ ExpectSep ();
break;
case TOK_ELSEIF:
*/
if (IfCond == 0) {
SetIfCond (D, ConstExpression ());
+ ExpectSep ();
}
/* Get the new overall condition */
* has been cleanup up, since we may be at end of file.
*/
NextTok ();
+ ExpectSep ();
/* Get the new overall condition */
IfCond = GetCurrentIfCond ();
NextTok ();
if (IfCond) {
SetIfCond (D, ConstExpression ());
+ ExpectSep ();
}
IfCond = GetCurrentIfCond ();
break;
D = AllocIf (".IFBLANK", 1);
NextTok ();
if (IfCond) {
- if (TokIsSep (Tok)) {
+ if (TokIsSep (CurTok.Tok)) {
SetIfCond (D, 1);
} else {
SetIfCond (D, 0);
NextTok ();
if (IfCond) {
ExprNode* Expr = Expression();
- SetIfCond (D, IsConstExpr (Expr));
+ SetIfCond (D, IsConstExpr (Expr, 0));
FreeExpr (Expr);
+ ExpectSep ();
}
IfCond = GetCurrentIfCond ();
break;
D = AllocIf (".IFDEF", 1);
NextTok ();
if (IfCond) {
- SymEntry* Sym = ParseScopedSymName (SYM_FIND_EXISTING);
+ SymEntry* Sym = ParseAnySymName (SYM_FIND_EXISTING);
SetIfCond (D, Sym != 0 && SymIsDef (Sym));
}
IfCond = GetCurrentIfCond ();
D = AllocIf (".IFNBLANK", 1);
NextTok ();
if (IfCond) {
- if (TokIsSep (Tok)) {
+ if (TokIsSep (CurTok.Tok)) {
SetIfCond (D, 0);
} else {
SetIfCond (D, 1);
SkipUntilSep ();
}
- }
+ }
IfCond = GetCurrentIfCond ();
break;
NextTok ();
if (IfCond) {
ExprNode* Expr = Expression();
- SetIfCond (D, !IsConstExpr (Expr));
+ SetIfCond (D, !IsConstExpr (Expr, 0));
FreeExpr (Expr);
+ ExpectSep ();
}
IfCond = GetCurrentIfCond ();
break;
D = AllocIf (".IFNDEF", 1);
NextTok ();
if (IfCond) {
- SymEntry* Sym = ParseScopedSymName (SYM_FIND_EXISTING);
+ SymEntry* Sym = ParseAnySymName (SYM_FIND_EXISTING);
SetIfCond (D, Sym == 0 || !SymIsDef (Sym));
+ ExpectSep ();
}
IfCond = GetCurrentIfCond ();
break;
D = AllocIf (".IFNREF", 1);
NextTok ();
if (IfCond) {
- SymEntry* Sym = ParseScopedSymName (SYM_FIND_EXISTING);
+ SymEntry* Sym = ParseAnySymName (SYM_FIND_EXISTING);
SetIfCond (D, Sym == 0 || !SymIsRef (Sym));
+ ExpectSep ();
}
IfCond = GetCurrentIfCond ();
break;
SetIfCond (D, GetCPU() == CPU_6502);
}
IfCond = GetCurrentIfCond ();
+ ExpectSep ();
break;
case TOK_IFP816:
D = AllocIf (".IFP816", 1);
- NextTok ();
+ NextTok ();
if (IfCond) {
SetIfCond (D, GetCPU() == CPU_65816);
}
IfCond = GetCurrentIfCond ();
+ ExpectSep ();
break;
case TOK_IFPC02:
SetIfCond (D, GetCPU() == CPU_65C02);
}
IfCond = GetCurrentIfCond ();
+ ExpectSep ();
break;
case TOK_IFPSC02:
SetIfCond (D, GetCPU() == CPU_65SC02);
}
IfCond = GetCurrentIfCond ();
+ ExpectSep ();
break;
case TOK_IFREF:
D = AllocIf (".IFREF", 1);
NextTok ();
if (IfCond) {
- SymEntry* Sym = ParseScopedSymName (SYM_FIND_EXISTING);
+ SymEntry* Sym = ParseAnySymName (SYM_FIND_EXISTING);
SetIfCond (D, Sym != 0 && SymIsRef (Sym));
+ ExpectSep ();
}
IfCond = GetCurrentIfCond ();
break;
}
- } while (IfCond == 0 && Tok != TOK_EOF);
+ } while (IfCond == 0 && CurTok.Tok != TOK_EOF);
+}
+
+
+
+int CheckConditionals (void)
+/* Check if the current token is one that starts a conditional directive, and
+ * call DoConditionals if so. Return true if a conditional directive was found,
+ * return false otherwise.
+ */
+{
+ switch (CurTok.Tok) {
+ case TOK_ELSE:
+ case TOK_ELSEIF:
+ case TOK_ENDIF:
+ case TOK_IF:
+ case TOK_IFBLANK:
+ case TOK_IFCONST:
+ case TOK_IFDEF:
+ case TOK_IFNBLANK:
+ case TOK_IFNCONST:
+ case TOK_IFNDEF:
+ case TOK_IFNREF:
+ case TOK_IFP02:
+ case TOK_IFP816:
+ case TOK_IFPC02:
+ case TOK_IFPSC02:
+ case TOK_IFREF:
+ DoConditionals ();
+ return 1;
+
+ default:
+ return 0;
+ }
}
break;
}
- if (D->Pos.Name != CurPos.Name) {
+ if (D->Pos.Name != CurTok.Pos.Name) {
/* The .if is from another file, bail out */
break;
}
+