diff options
Diffstat (limited to 'source/compiler/prscan.c')
-rw-r--r-- | source/compiler/prscan.c | 46 |
1 files changed, 36 insertions, 10 deletions
diff --git a/source/compiler/prscan.c b/source/compiler/prscan.c index f781deb..cc9b3ce 100644 --- a/source/compiler/prscan.c +++ b/source/compiler/prscan.c @@ -477,6 +477,7 @@ PrDoDirective ( switch (Directive) { case PR_DIRECTIVE_ELIF: + *IgnoringThisCodeBlock = !(*IgnoringThisCodeBlock); if (*IgnoringThisCodeBlock == TRUE) { @@ -493,10 +494,12 @@ PrDoDirective ( break; case PR_DIRECTIVE_ELSE: + *IgnoringThisCodeBlock = !(*IgnoringThisCodeBlock); return; case PR_DIRECTIVE_ENDIF: + *IgnoringThisCodeBlock = FALSE; Gbl_IfDepth--; if (Gbl_IfDepth < 0) @@ -508,6 +511,7 @@ PrDoDirective ( return; default: + break; } @@ -590,6 +594,7 @@ PrDoDirective ( break; case PR_DIRECTIVE_ERROR: + /* TBD compiler should abort */ /* Note: No macro expansion */ @@ -598,6 +603,7 @@ PrDoDirective ( break; case PR_DIRECTIVE_IF: + TokenOffset = Token - Gbl_MainTokenBuffer; /* Need to expand #define macros in the expression string first */ @@ -623,6 +629,7 @@ PrDoDirective ( break; case PR_DIRECTIVE_IFDEF: + if (!PrMatchDefine (Token)) { *IgnoringThisCodeBlock = TRUE; @@ -635,6 +642,7 @@ PrDoDirective ( break; case PR_DIRECTIVE_IFNDEF: + if (PrMatchDefine (Token)) { *IgnoringThisCodeBlock = TRUE; @@ -647,6 +655,7 @@ PrDoDirective ( break; case PR_DIRECTIVE_INCLUDE: + Token = PrGetNextToken (NULL, " \"<>", Next); if (!Token) { @@ -661,6 +670,7 @@ PrDoDirective ( break; case PR_DIRECTIVE_LINE: + TokenOffset = Token - Gbl_MainTokenBuffer; Status = PrResolveIntegerExpression ( @@ -686,26 +696,40 @@ PrDoDirective ( break; case PR_DIRECTIVE_PRAGMA: - /* Only "#pragma message" supported at this time */ - if (strcmp (Token, "message")) + if (!strcmp (Token, "disable")) { - PrError (ASL_ERROR, ASL_MSG_UNKNOWN_PRAGMA, - THIS_TOKEN_OFFSET (Token)); - return; + Token = PrGetNextToken (NULL, PR_TOKEN_SEPARATORS, Next); + if (!Token) + { + goto SyntaxError; + } + + TokenOffset = Token - Gbl_MainTokenBuffer; + AslDisableException (&Gbl_CurrentLineBuffer[TokenOffset]); } + else if (!strcmp (Token, "message")) + { + Token = PrGetNextToken (NULL, PR_TOKEN_SEPARATORS, Next); + if (!Token) + { + goto SyntaxError; + } - Token = PrGetNextToken (NULL, PR_TOKEN_SEPARATORS, Next); - if (!Token) + TokenOffset = Token - Gbl_MainTokenBuffer; + AcpiOsPrintf ("%s\n", &Gbl_CurrentLineBuffer[TokenOffset]); + } + else { - goto SyntaxError; + PrError (ASL_ERROR, ASL_MSG_UNKNOWN_PRAGMA, + THIS_TOKEN_OFFSET (Token)); + return; } - TokenOffset = Token - Gbl_MainTokenBuffer; - AcpiOsPrintf ("%s\n", &Gbl_CurrentLineBuffer[TokenOffset]); break; case PR_DIRECTIVE_UNDEF: + DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID "#undef: %s\n", Gbl_CurrentLineNumber, Token); @@ -713,11 +737,13 @@ PrDoDirective ( break; case PR_DIRECTIVE_WARNING: + PrError (ASL_WARNING, ASL_MSG_ERROR_DIRECTIVE, THIS_TOKEN_OFFSET (Token)); break; default: + /* Should never get here */ DbgPrint (ASL_DEBUG_OUTPUT, PR_PREFIX_ID "Unrecognized directive: %u\n", |