130fdf1140b8d1ce93f3821d986fa165552023440lgao/** @file
230fdf1140b8d1ce93f3821d986fa165552023440lgao
330fdf1140b8d1ce93f3821d986fa165552023440lgao  VfrCompiler error handler.
430fdf1140b8d1ce93f3821d986fa165552023440lgao
54afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming GaoCopyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>
640d841f6a8f84e75409178e19e69b95e01bada0flgaoThis program and the accompanying materials
730fdf1140b8d1ce93f3821d986fa165552023440lgaoare licensed and made available under the terms and conditions of the BSD License
830fdf1140b8d1ce93f3821d986fa165552023440lgaowhich accompanies this distribution.  The full text of the license may be found at
930fdf1140b8d1ce93f3821d986fa165552023440lgaohttp://opensource.org/licenses/bsd-license.php
1030fdf1140b8d1ce93f3821d986fa165552023440lgao
1130fdf1140b8d1ce93f3821d986fa165552023440lgaoTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
1230fdf1140b8d1ce93f3821d986fa165552023440lgaoWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
1330fdf1140b8d1ce93f3821d986fa165552023440lgao
1430fdf1140b8d1ce93f3821d986fa165552023440lgao**/
1530fdf1140b8d1ce93f3821d986fa165552023440lgao
1630fdf1140b8d1ce93f3821d986fa165552023440lgao#include "stdio.h"
1730fdf1140b8d1ce93f3821d986fa165552023440lgao#include "string.h"
1830fdf1140b8d1ce93f3821d986fa165552023440lgao#include "stdlib.h"
1930fdf1140b8d1ce93f3821d986fa165552023440lgao#include "VfrError.h"
2030fdf1140b8d1ce93f3821d986fa165552023440lgao#include "EfiUtilityMsgs.h"
2130fdf1140b8d1ce93f3821d986fa165552023440lgao
2230fdf1140b8d1ce93f3821d986fa165552023440lgaostatic SVFR_ERROR_HANDLE VFR_ERROR_HANDLE_TABLE [] = {
2330fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_SUCCESS, NULL },
2430fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_ERROR_SKIPED, NULL },
2530fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_FATAL_ERROR, ": fatal error!!" },
2630fdf1140b8d1ce93f3821d986fa165552023440lgao
2730fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_MISMATCHED, ": unexpected token" },
2830fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_INVALID_PARAMETER, ": invalid parameter" },
2930fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_OUT_FOR_RESOURCES, ": system out of memory" },
3030fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_UNSUPPORTED, ": unsupported" },
3130fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_REDEFINED, ": already defined" },
3230fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_FORMID_REDEFINED, ": form id already defined" },
3330fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_QUESTIONID_REDEFINED, ": question id already defined" },
3430fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_VARSTOREID_REDEFINED, ": varstore id already defined" },
3530fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_UNDEFINED, ": undefined" },
3630fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_VAR_NOTDEFINED_BY_QUESTION, ": some variable has not defined by a question"},
37da92f27632d2c89fa8726948ac9b02461ca8b61elgao  { VFR_RETURN_VARSTORE_DATATYPE_REDEFINED_ERROR, ": Data Structure is defined by more than one varstores, it can't be referred as varstore, only varstore name could be used."},
3830fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_GET_EFIVARSTORE_ERROR, ": get efi varstore error"},
3930fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_EFIVARSTORE_USE_ERROR, ": can not use the efi varstore like this" },
4030fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_EFIVARSTORE_SIZE_ERROR, ": unsupport efi varstore size should be <= 8 bytes" },
4130fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_GET_NVVARSTORE_ERROR, ": get name value varstore error" },
4230fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_QVAR_REUSE, ": variable reused by more than one question" },
4330fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_FLAGS_UNSUPPORTED, ": flags unsupported" },
4430fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_ERROR_ARRARY_NUM, ": array number error, the valid value is in (0 ~ MAX_INDEX-1) for UEFI vfr and in (1 ~ MAX_INDEX) for Framework Vfr" },
4530fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_DATA_STRING_ERROR, ": data field string error or not support"},
4630fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_DEFAULT_VALUE_REDEFINED, ": default value re-defined with different value"},
4730fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_CONSTANT_ONLY, ": only constant is allowed in the expression"},
484afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  { VFR_RETURN_VARSTORE_NAME_REDEFINED_ERROR, ": Varstore name is defined by more than one varstores, it can't be referred as varstore, only varstore strucure name could be used."},
4930fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_CODEUNDEFINED, ": undefined Error Code" }
5030fdf1140b8d1ce93f3821d986fa165552023440lgao};
5130fdf1140b8d1ce93f3821d986fa165552023440lgao
524afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gaostatic SVFR_WARNING_HANDLE VFR_WARNING_HANDLE_TABLE [] = {
534afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  { VFR_WARNING_DEFAULT_VALUE_REDEFINED, ": default value re-defined with different value"},
54e4ac870fe95adc7d178a79b73ad2792e0c8bfeb8Gao, Liming  { VFR_WARNING_STRING_TO_UINT_OVERFLOW, ": String to UINT* Overflow"},
551d218f83f1d2aefb28d728ff01c89b10d103dc65Eric Dong  { VFR_WARNING_ACTION_WITH_TEXT_TWO, ": Action opcode should not have TextTwo part"},
5605154781676f8f591f4c0846ba6305ab9716c9e6Eric Dong  { VFR_WARNING_OBSOLETED_FRAMEWORK_OPCODE, ": Not recommend to use obsoleted framework opcode"},
574afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  { VFR_WARNING_CODEUNDEFINED, ": undefined Warning Code" }
584afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao};
594afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao
6030fdf1140b8d1ce93f3821d986fa165552023440lgaoCVfrErrorHandle::CVfrErrorHandle (
6130fdf1140b8d1ce93f3821d986fa165552023440lgao  VOID
6230fdf1140b8d1ce93f3821d986fa165552023440lgao  )
6330fdf1140b8d1ce93f3821d986fa165552023440lgao{
644afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  mInputFileName         = NULL;
654afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  mScopeRecordListHead   = NULL;
664afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  mScopeRecordListTail   = NULL;
674afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  mVfrErrorHandleTable   = VFR_ERROR_HANDLE_TABLE;
684afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  mVfrWarningHandleTable = VFR_WARNING_HANDLE_TABLE;
6930fdf1140b8d1ce93f3821d986fa165552023440lgao}
7030fdf1140b8d1ce93f3821d986fa165552023440lgao
7130fdf1140b8d1ce93f3821d986fa165552023440lgaoCVfrErrorHandle::~CVfrErrorHandle (
7230fdf1140b8d1ce93f3821d986fa165552023440lgao  VOID
7330fdf1140b8d1ce93f3821d986fa165552023440lgao  )
7430fdf1140b8d1ce93f3821d986fa165552023440lgao{
7530fdf1140b8d1ce93f3821d986fa165552023440lgao  SVfrFileScopeRecord *pNode = NULL;
7630fdf1140b8d1ce93f3821d986fa165552023440lgao
7730fdf1140b8d1ce93f3821d986fa165552023440lgao  if (mInputFileName != NULL) {
7830fdf1140b8d1ce93f3821d986fa165552023440lgao    delete mInputFileName;
7930fdf1140b8d1ce93f3821d986fa165552023440lgao  }
8030fdf1140b8d1ce93f3821d986fa165552023440lgao
8130fdf1140b8d1ce93f3821d986fa165552023440lgao  while (mScopeRecordListHead != NULL) {
8230fdf1140b8d1ce93f3821d986fa165552023440lgao    pNode = mScopeRecordListHead;
8330fdf1140b8d1ce93f3821d986fa165552023440lgao    mScopeRecordListHead = mScopeRecordListHead->mNext;
8430fdf1140b8d1ce93f3821d986fa165552023440lgao    delete pNode;
8530fdf1140b8d1ce93f3821d986fa165552023440lgao  }
8630fdf1140b8d1ce93f3821d986fa165552023440lgao
874afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  mScopeRecordListHead   = NULL;
884afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  mScopeRecordListTail   = NULL;
894afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  mVfrErrorHandleTable   = NULL;
904afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  mVfrWarningHandleTable = NULL;
914afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao}
924afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao
934afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming GaoVOID
944afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming GaoCVfrErrorHandle::SetWarningAsError (
954afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  IN BOOLEAN  WarningAsError
964afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  )
974afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao{
984afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  mWarningAsError = WarningAsError;
9930fdf1140b8d1ce93f3821d986fa165552023440lgao}
10030fdf1140b8d1ce93f3821d986fa165552023440lgao
10130fdf1140b8d1ce93f3821d986fa165552023440lgaoVOID
10230fdf1140b8d1ce93f3821d986fa165552023440lgaoCVfrErrorHandle::SetInputFile (
10330fdf1140b8d1ce93f3821d986fa165552023440lgao  IN CHAR8    *InputFile
10430fdf1140b8d1ce93f3821d986fa165552023440lgao  )
10530fdf1140b8d1ce93f3821d986fa165552023440lgao{
10630fdf1140b8d1ce93f3821d986fa165552023440lgao  if (InputFile != NULL) {
10730fdf1140b8d1ce93f3821d986fa165552023440lgao    mInputFileName = new CHAR8[strlen(InputFile) + 1];
10830fdf1140b8d1ce93f3821d986fa165552023440lgao    strcpy (mInputFileName, InputFile);
10930fdf1140b8d1ce93f3821d986fa165552023440lgao  }
11030fdf1140b8d1ce93f3821d986fa165552023440lgao}
11130fdf1140b8d1ce93f3821d986fa165552023440lgao
11230fdf1140b8d1ce93f3821d986fa165552023440lgaoSVfrFileScopeRecord::SVfrFileScopeRecord (
11330fdf1140b8d1ce93f3821d986fa165552023440lgao  IN CHAR8    *Record,
11430fdf1140b8d1ce93f3821d986fa165552023440lgao  IN UINT32   LineNum
11530fdf1140b8d1ce93f3821d986fa165552023440lgao  )
11630fdf1140b8d1ce93f3821d986fa165552023440lgao{
11730fdf1140b8d1ce93f3821d986fa165552023440lgao  UINT32      Index;
11830fdf1140b8d1ce93f3821d986fa165552023440lgao  CHAR8       *FileName = NULL;
11930fdf1140b8d1ce93f3821d986fa165552023440lgao  CHAR8       *Str      = NULL;
12030fdf1140b8d1ce93f3821d986fa165552023440lgao
12130fdf1140b8d1ce93f3821d986fa165552023440lgao  mWholeScopeLine      = LineNum;
12230fdf1140b8d1ce93f3821d986fa165552023440lgao  mNext                = NULL;
12330fdf1140b8d1ce93f3821d986fa165552023440lgao
12430fdf1140b8d1ce93f3821d986fa165552023440lgao  Str = strchr (Record, ' ');
12530fdf1140b8d1ce93f3821d986fa165552023440lgao  mScopeLineStart = atoi (++Str);
12630fdf1140b8d1ce93f3821d986fa165552023440lgao
12730fdf1140b8d1ce93f3821d986fa165552023440lgao  Str = strchr (Str, '\"');
12830fdf1140b8d1ce93f3821d986fa165552023440lgao  FileName = ++Str;
12930fdf1140b8d1ce93f3821d986fa165552023440lgao
13030fdf1140b8d1ce93f3821d986fa165552023440lgao  while((Str = strstr (FileName, "\\\\")) != NULL) {
13130fdf1140b8d1ce93f3821d986fa165552023440lgao    FileName = Str + 2;
13230fdf1140b8d1ce93f3821d986fa165552023440lgao  }
13330fdf1140b8d1ce93f3821d986fa165552023440lgao  if ((mFileName = new CHAR8[strlen(FileName)]) != NULL) {
13430fdf1140b8d1ce93f3821d986fa165552023440lgao    for (Index = 0; FileName[Index] != '\"'; Index++) {
13530fdf1140b8d1ce93f3821d986fa165552023440lgao      mFileName[Index] = FileName[Index];
13630fdf1140b8d1ce93f3821d986fa165552023440lgao    }
13730fdf1140b8d1ce93f3821d986fa165552023440lgao    mFileName[Index] = '\0';
13830fdf1140b8d1ce93f3821d986fa165552023440lgao  }
13930fdf1140b8d1ce93f3821d986fa165552023440lgao
14030fdf1140b8d1ce93f3821d986fa165552023440lgao  return;
14130fdf1140b8d1ce93f3821d986fa165552023440lgao}
14230fdf1140b8d1ce93f3821d986fa165552023440lgao
14330fdf1140b8d1ce93f3821d986fa165552023440lgaoSVfrFileScopeRecord::~SVfrFileScopeRecord (
14430fdf1140b8d1ce93f3821d986fa165552023440lgao  VOID
14530fdf1140b8d1ce93f3821d986fa165552023440lgao  )
14630fdf1140b8d1ce93f3821d986fa165552023440lgao{
14730fdf1140b8d1ce93f3821d986fa165552023440lgao  if (mFileName != NULL) {
14830fdf1140b8d1ce93f3821d986fa165552023440lgao    delete mFileName;
14930fdf1140b8d1ce93f3821d986fa165552023440lgao  }
15030fdf1140b8d1ce93f3821d986fa165552023440lgao}
15130fdf1140b8d1ce93f3821d986fa165552023440lgao
15230fdf1140b8d1ce93f3821d986fa165552023440lgaoVOID
15330fdf1140b8d1ce93f3821d986fa165552023440lgaoCVfrErrorHandle::ParseFileScopeRecord (
15430fdf1140b8d1ce93f3821d986fa165552023440lgao  IN CHAR8     *Record,
15530fdf1140b8d1ce93f3821d986fa165552023440lgao  IN UINT32    WholeScopeLine
15630fdf1140b8d1ce93f3821d986fa165552023440lgao  )
15730fdf1140b8d1ce93f3821d986fa165552023440lgao{
15830fdf1140b8d1ce93f3821d986fa165552023440lgao  SVfrFileScopeRecord *pNode        = NULL;
15930fdf1140b8d1ce93f3821d986fa165552023440lgao
16030fdf1140b8d1ce93f3821d986fa165552023440lgao  if (Record == NULL) {
16130fdf1140b8d1ce93f3821d986fa165552023440lgao    return;
16230fdf1140b8d1ce93f3821d986fa165552023440lgao  }
16330fdf1140b8d1ce93f3821d986fa165552023440lgao
16430fdf1140b8d1ce93f3821d986fa165552023440lgao  if ((pNode = new SVfrFileScopeRecord(Record, WholeScopeLine)) == NULL) {
16530fdf1140b8d1ce93f3821d986fa165552023440lgao    return;
16630fdf1140b8d1ce93f3821d986fa165552023440lgao  }
16730fdf1140b8d1ce93f3821d986fa165552023440lgao
16830fdf1140b8d1ce93f3821d986fa165552023440lgao  if (mScopeRecordListHead == NULL) {
16930fdf1140b8d1ce93f3821d986fa165552023440lgao    mScopeRecordListTail = mScopeRecordListHead = pNode;
17030fdf1140b8d1ce93f3821d986fa165552023440lgao  } else {
17130fdf1140b8d1ce93f3821d986fa165552023440lgao    mScopeRecordListTail->mNext = pNode;
17230fdf1140b8d1ce93f3821d986fa165552023440lgao    mScopeRecordListTail        = pNode;
17330fdf1140b8d1ce93f3821d986fa165552023440lgao  }
17430fdf1140b8d1ce93f3821d986fa165552023440lgao}
17530fdf1140b8d1ce93f3821d986fa165552023440lgao
17630fdf1140b8d1ce93f3821d986fa165552023440lgaoVOID
17730fdf1140b8d1ce93f3821d986fa165552023440lgaoCVfrErrorHandle::GetFileNameLineNum (
17830fdf1140b8d1ce93f3821d986fa165552023440lgao  IN  UINT32 LineNum,
17930fdf1140b8d1ce93f3821d986fa165552023440lgao  OUT CHAR8  **FileName,
18030fdf1140b8d1ce93f3821d986fa165552023440lgao  OUT UINT32 *FileLine
18130fdf1140b8d1ce93f3821d986fa165552023440lgao  )
18230fdf1140b8d1ce93f3821d986fa165552023440lgao{
18330fdf1140b8d1ce93f3821d986fa165552023440lgao  SVfrFileScopeRecord *pNode    = NULL;
18430fdf1140b8d1ce93f3821d986fa165552023440lgao
18530fdf1140b8d1ce93f3821d986fa165552023440lgao  if ((FileName == NULL) || (FileLine == NULL)) {
18630fdf1140b8d1ce93f3821d986fa165552023440lgao    return;
18730fdf1140b8d1ce93f3821d986fa165552023440lgao  }
18830fdf1140b8d1ce93f3821d986fa165552023440lgao
18930fdf1140b8d1ce93f3821d986fa165552023440lgao  *FileName = NULL;
19030fdf1140b8d1ce93f3821d986fa165552023440lgao  *FileLine = 0xFFFFFFFF;
19130fdf1140b8d1ce93f3821d986fa165552023440lgao
19230fdf1140b8d1ce93f3821d986fa165552023440lgao  //
19330fdf1140b8d1ce93f3821d986fa165552023440lgao  // Some errors occur before scope record list been built.
19430fdf1140b8d1ce93f3821d986fa165552023440lgao  //
19530fdf1140b8d1ce93f3821d986fa165552023440lgao  if (mScopeRecordListHead == NULL) {
19630fdf1140b8d1ce93f3821d986fa165552023440lgao    *FileLine = LineNum;
19730fdf1140b8d1ce93f3821d986fa165552023440lgao    *FileName = mInputFileName;
19830fdf1140b8d1ce93f3821d986fa165552023440lgao    return ;
19930fdf1140b8d1ce93f3821d986fa165552023440lgao  }
20030fdf1140b8d1ce93f3821d986fa165552023440lgao
20130fdf1140b8d1ce93f3821d986fa165552023440lgao  for (pNode = mScopeRecordListHead; pNode->mNext != NULL; pNode = pNode->mNext) {
20230fdf1140b8d1ce93f3821d986fa165552023440lgao    if ((LineNum > pNode->mWholeScopeLine) && (pNode->mNext->mWholeScopeLine > LineNum)) {
20330fdf1140b8d1ce93f3821d986fa165552023440lgao      *FileName = pNode->mFileName;
20430fdf1140b8d1ce93f3821d986fa165552023440lgao      *FileLine = LineNum - pNode->mWholeScopeLine + pNode->mScopeLineStart - 1;
20530fdf1140b8d1ce93f3821d986fa165552023440lgao      return ;
20630fdf1140b8d1ce93f3821d986fa165552023440lgao    }
20730fdf1140b8d1ce93f3821d986fa165552023440lgao  }
20830fdf1140b8d1ce93f3821d986fa165552023440lgao
20930fdf1140b8d1ce93f3821d986fa165552023440lgao  *FileName = pNode->mFileName;
21030fdf1140b8d1ce93f3821d986fa165552023440lgao  *FileLine = LineNum - pNode->mWholeScopeLine + pNode->mScopeLineStart - 1;
21130fdf1140b8d1ce93f3821d986fa165552023440lgao}
21230fdf1140b8d1ce93f3821d986fa165552023440lgao
21330fdf1140b8d1ce93f3821d986fa165552023440lgaoVOID
21430fdf1140b8d1ce93f3821d986fa165552023440lgaoCVfrErrorHandle::PrintMsg (
21530fdf1140b8d1ce93f3821d986fa165552023440lgao  IN UINT32               LineNum,
21630fdf1140b8d1ce93f3821d986fa165552023440lgao  IN CHAR8                *TokName,
21752302d4dee589a5df43a464420c9fe68ba83937dlgao  IN CONST CHAR8          *MsgType,
21852302d4dee589a5df43a464420c9fe68ba83937dlgao  IN CONST CHAR8          *ErrorMsg
21930fdf1140b8d1ce93f3821d986fa165552023440lgao  )
22030fdf1140b8d1ce93f3821d986fa165552023440lgao{
22130fdf1140b8d1ce93f3821d986fa165552023440lgao  CHAR8                  *FileName = NULL;
22230fdf1140b8d1ce93f3821d986fa165552023440lgao  UINT32                 FileLine;
223fd171542e0aa89ac12a09d79608173f48019b14bvanjeff
224fd171542e0aa89ac12a09d79608173f48019b14bvanjeff  if (strncmp ("Warning", MsgType, strlen ("Warning")) == 0) {
22552302d4dee589a5df43a464420c9fe68ba83937dlgao    VerboseMsg ((CHAR8 *) ErrorMsg);
226fd171542e0aa89ac12a09d79608173f48019b14bvanjeff    return;
227fd171542e0aa89ac12a09d79608173f48019b14bvanjeff  }
22830fdf1140b8d1ce93f3821d986fa165552023440lgao  GetFileNameLineNum (LineNum, &FileName, &FileLine);
22952302d4dee589a5df43a464420c9fe68ba83937dlgao  Error (FileName, FileLine, 0x3000, TokName, (CHAR8 *) "\t%s\n", (CHAR8 *) ErrorMsg);
23030fdf1140b8d1ce93f3821d986fa165552023440lgao}
23130fdf1140b8d1ce93f3821d986fa165552023440lgao
23230fdf1140b8d1ce93f3821d986fa165552023440lgaoUINT8
23330fdf1140b8d1ce93f3821d986fa165552023440lgaoCVfrErrorHandle::HandleError (
23430fdf1140b8d1ce93f3821d986fa165552023440lgao  IN EFI_VFR_RETURN_CODE  ErrorCode,
23530fdf1140b8d1ce93f3821d986fa165552023440lgao  IN UINT32               LineNum,
23630fdf1140b8d1ce93f3821d986fa165552023440lgao  IN CHAR8                *TokName
23730fdf1140b8d1ce93f3821d986fa165552023440lgao  )
23830fdf1140b8d1ce93f3821d986fa165552023440lgao{
23930fdf1140b8d1ce93f3821d986fa165552023440lgao  UINT32                 Index;
24030fdf1140b8d1ce93f3821d986fa165552023440lgao  CHAR8                  *FileName = NULL;
24130fdf1140b8d1ce93f3821d986fa165552023440lgao  UINT32                 FileLine;
24252302d4dee589a5df43a464420c9fe68ba83937dlgao  CONST CHAR8            *ErrorMsg = NULL;
24330fdf1140b8d1ce93f3821d986fa165552023440lgao
24430fdf1140b8d1ce93f3821d986fa165552023440lgao  if (mVfrErrorHandleTable == NULL) {
24530fdf1140b8d1ce93f3821d986fa165552023440lgao    return 1;
24630fdf1140b8d1ce93f3821d986fa165552023440lgao  }
24730fdf1140b8d1ce93f3821d986fa165552023440lgao
24830fdf1140b8d1ce93f3821d986fa165552023440lgao  for (Index = 0; mVfrErrorHandleTable[Index].mErrorCode != VFR_RETURN_CODEUNDEFINED; Index++) {
24930fdf1140b8d1ce93f3821d986fa165552023440lgao    if (ErrorCode == mVfrErrorHandleTable[Index].mErrorCode) {
25030fdf1140b8d1ce93f3821d986fa165552023440lgao      ErrorMsg = mVfrErrorHandleTable[Index].mErrorMsg;
25130fdf1140b8d1ce93f3821d986fa165552023440lgao      break;
25230fdf1140b8d1ce93f3821d986fa165552023440lgao    }
25330fdf1140b8d1ce93f3821d986fa165552023440lgao  }
25430fdf1140b8d1ce93f3821d986fa165552023440lgao
25530fdf1140b8d1ce93f3821d986fa165552023440lgao  if (ErrorMsg != NULL) {
25630fdf1140b8d1ce93f3821d986fa165552023440lgao    GetFileNameLineNum (LineNum, &FileName, &FileLine);
25752302d4dee589a5df43a464420c9fe68ba83937dlgao    Error (FileName, FileLine, 0x3000, TokName, (CHAR8 *) "\t%s\n", (CHAR8 *) ErrorMsg);
25830fdf1140b8d1ce93f3821d986fa165552023440lgao    return 1;
25930fdf1140b8d1ce93f3821d986fa165552023440lgao  } else {
26030fdf1140b8d1ce93f3821d986fa165552023440lgao    return 0;
26130fdf1140b8d1ce93f3821d986fa165552023440lgao  }
26230fdf1140b8d1ce93f3821d986fa165552023440lgao}
26330fdf1140b8d1ce93f3821d986fa165552023440lgao
2644afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming GaoUINT8
2654afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming GaoCVfrErrorHandle::HandleWarning (
2664afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  IN EFI_VFR_WARNING_CODE WarningCode,
2674afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  IN UINT32               LineNum,
2684afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  IN CHAR8                *TokName
2694afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  )
2704afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao{
2714afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  UINT32                 Index;
2724afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  CHAR8                  *FileName = NULL;
2734afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  UINT32                 FileLine;
2744afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  CONST CHAR8            *WarningMsg = NULL;
2754afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao
2764afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  if (mVfrWarningHandleTable == NULL) {
2774afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao    return 1;
2784afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  }
2794afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao
2804afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  GetFileNameLineNum (LineNum, &FileName, &FileLine);
2814afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao
2824afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  if (mWarningAsError) {
283868c9c35a6cf0ceec4056e348c3157d8226925ecYonghong Zhu    Error (FileName, FileLine, 0x2220, (CHAR8 *) "warning treated as error", NULL);
2844afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  }
2854afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao
2864afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  for (Index = 0; mVfrWarningHandleTable[Index].mWarningCode != VFR_WARNING_CODEUNDEFINED; Index++) {
2874afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao    if (WarningCode == mVfrWarningHandleTable[Index].mWarningCode) {
2884afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao      WarningMsg = mVfrWarningHandleTable[Index].mWarningMsg;
2894afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao      break;
2904afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao    }
2914afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  }
2924afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao
2934afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  if (WarningMsg != NULL) {
2944afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao    Warning (FileName, FileLine, 0, TokName, (CHAR8 *) "\t%s\n", (CHAR8 *) WarningMsg);
2954afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao    return 1;
2964afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  } else {
2974afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao    return 0;
2984afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao  }
2994afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao}
3004afd3d042215afe68d00b9ab8c32f063a3a1c03fLiming Gao
30130fdf1140b8d1ce93f3821d986fa165552023440lgaoCVfrErrorHandle gCVfrErrorHandle;
302