VfrError.cpp revision fd171542e0aa89ac12a09d79608173f48019b14b
130fdf1140b8d1ce93f3821d986fa165552023440lgao/** @file
230fdf1140b8d1ce93f3821d986fa165552023440lgao
330fdf1140b8d1ce93f3821d986fa165552023440lgao  VfrCompiler error handler.
430fdf1140b8d1ce93f3821d986fa165552023440lgao
530fdf1140b8d1ce93f3821d986fa165552023440lgaoCopyright (c) 2004 - 2008, Intel Corporation
630fdf1140b8d1ce93f3821d986fa165552023440lgaoAll rights reserved. This 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"},
3730fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_GET_EFIVARSTORE_ERROR, ": get efi varstore error"},
3830fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_EFIVARSTORE_USE_ERROR, ": can not use the efi varstore like this" },
3930fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_EFIVARSTORE_SIZE_ERROR, ": unsupport efi varstore size should be <= 8 bytes" },
4030fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_GET_NVVARSTORE_ERROR, ": get name value varstore error" },
4130fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_QVAR_REUSE, ": variable reused by more than one question" },
4230fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_FLAGS_UNSUPPORTED, ": flags unsupported" },
4330fdf1140b8d1ce93f3821d986fa165552023440lgao  { 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" },
4430fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_DATA_STRING_ERROR, ": data field string error or not support"},
4530fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_DEFAULT_VALUE_REDEFINED, ": default value re-defined with different value"},
4630fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_CONSTANT_ONLY, ": only constant is allowed in the expression"},
4730fdf1140b8d1ce93f3821d986fa165552023440lgao  { VFR_RETURN_CODEUNDEFINED, ": undefined Error Code" }
4830fdf1140b8d1ce93f3821d986fa165552023440lgao};
4930fdf1140b8d1ce93f3821d986fa165552023440lgao
5030fdf1140b8d1ce93f3821d986fa165552023440lgaoCVfrErrorHandle::CVfrErrorHandle (
5130fdf1140b8d1ce93f3821d986fa165552023440lgao  VOID
5230fdf1140b8d1ce93f3821d986fa165552023440lgao  )
5330fdf1140b8d1ce93f3821d986fa165552023440lgao{
5430fdf1140b8d1ce93f3821d986fa165552023440lgao  mInputFileName       = NULL;
5530fdf1140b8d1ce93f3821d986fa165552023440lgao  mScopeRecordListHead = NULL;
5630fdf1140b8d1ce93f3821d986fa165552023440lgao  mScopeRecordListTail = NULL;
5730fdf1140b8d1ce93f3821d986fa165552023440lgao  mVfrErrorHandleTable = VFR_ERROR_HANDLE_TABLE;
5830fdf1140b8d1ce93f3821d986fa165552023440lgao}
5930fdf1140b8d1ce93f3821d986fa165552023440lgao
6030fdf1140b8d1ce93f3821d986fa165552023440lgaoCVfrErrorHandle::~CVfrErrorHandle (
6130fdf1140b8d1ce93f3821d986fa165552023440lgao  VOID
6230fdf1140b8d1ce93f3821d986fa165552023440lgao  )
6330fdf1140b8d1ce93f3821d986fa165552023440lgao{
6430fdf1140b8d1ce93f3821d986fa165552023440lgao  SVfrFileScopeRecord *pNode = NULL;
6530fdf1140b8d1ce93f3821d986fa165552023440lgao
6630fdf1140b8d1ce93f3821d986fa165552023440lgao  if (mInputFileName != NULL) {
6730fdf1140b8d1ce93f3821d986fa165552023440lgao    delete mInputFileName;
6830fdf1140b8d1ce93f3821d986fa165552023440lgao  }
6930fdf1140b8d1ce93f3821d986fa165552023440lgao
7030fdf1140b8d1ce93f3821d986fa165552023440lgao  while (mScopeRecordListHead != NULL) {
7130fdf1140b8d1ce93f3821d986fa165552023440lgao    pNode = mScopeRecordListHead;
7230fdf1140b8d1ce93f3821d986fa165552023440lgao    mScopeRecordListHead = mScopeRecordListHead->mNext;
7330fdf1140b8d1ce93f3821d986fa165552023440lgao    delete pNode;
7430fdf1140b8d1ce93f3821d986fa165552023440lgao  }
7530fdf1140b8d1ce93f3821d986fa165552023440lgao
7630fdf1140b8d1ce93f3821d986fa165552023440lgao  mScopeRecordListHead = NULL;
7730fdf1140b8d1ce93f3821d986fa165552023440lgao  mScopeRecordListTail = NULL;
7830fdf1140b8d1ce93f3821d986fa165552023440lgao  mVfrErrorHandleTable = NULL;
7930fdf1140b8d1ce93f3821d986fa165552023440lgao}
8030fdf1140b8d1ce93f3821d986fa165552023440lgao
8130fdf1140b8d1ce93f3821d986fa165552023440lgaoVOID
8230fdf1140b8d1ce93f3821d986fa165552023440lgaoCVfrErrorHandle::SetInputFile (
8330fdf1140b8d1ce93f3821d986fa165552023440lgao  IN CHAR8    *InputFile
8430fdf1140b8d1ce93f3821d986fa165552023440lgao  )
8530fdf1140b8d1ce93f3821d986fa165552023440lgao{
8630fdf1140b8d1ce93f3821d986fa165552023440lgao  if (InputFile != NULL) {
8730fdf1140b8d1ce93f3821d986fa165552023440lgao    mInputFileName = new CHAR8[strlen(InputFile) + 1];
8830fdf1140b8d1ce93f3821d986fa165552023440lgao    strcpy (mInputFileName, InputFile);
8930fdf1140b8d1ce93f3821d986fa165552023440lgao  }
9030fdf1140b8d1ce93f3821d986fa165552023440lgao}
9130fdf1140b8d1ce93f3821d986fa165552023440lgao
9230fdf1140b8d1ce93f3821d986fa165552023440lgaoSVfrFileScopeRecord::SVfrFileScopeRecord (
9330fdf1140b8d1ce93f3821d986fa165552023440lgao  IN CHAR8    *Record,
9430fdf1140b8d1ce93f3821d986fa165552023440lgao  IN UINT32   LineNum
9530fdf1140b8d1ce93f3821d986fa165552023440lgao  )
9630fdf1140b8d1ce93f3821d986fa165552023440lgao{
9730fdf1140b8d1ce93f3821d986fa165552023440lgao  UINT32      Index;
9830fdf1140b8d1ce93f3821d986fa165552023440lgao  CHAR8       *FileName = NULL;
9930fdf1140b8d1ce93f3821d986fa165552023440lgao  CHAR8       *Str      = NULL;
10030fdf1140b8d1ce93f3821d986fa165552023440lgao
10130fdf1140b8d1ce93f3821d986fa165552023440lgao  mWholeScopeLine      = LineNum;
10230fdf1140b8d1ce93f3821d986fa165552023440lgao  mNext                = NULL;
10330fdf1140b8d1ce93f3821d986fa165552023440lgao
10430fdf1140b8d1ce93f3821d986fa165552023440lgao  Str = strchr (Record, ' ');
10530fdf1140b8d1ce93f3821d986fa165552023440lgao  mScopeLineStart = atoi (++Str);
10630fdf1140b8d1ce93f3821d986fa165552023440lgao
10730fdf1140b8d1ce93f3821d986fa165552023440lgao  Str = strchr (Str, '\"');
10830fdf1140b8d1ce93f3821d986fa165552023440lgao  FileName = ++Str;
10930fdf1140b8d1ce93f3821d986fa165552023440lgao
11030fdf1140b8d1ce93f3821d986fa165552023440lgao  while((Str = strstr (FileName, "\\\\")) != NULL) {
11130fdf1140b8d1ce93f3821d986fa165552023440lgao    FileName = Str + 2;
11230fdf1140b8d1ce93f3821d986fa165552023440lgao  }
11330fdf1140b8d1ce93f3821d986fa165552023440lgao  if ((mFileName = new CHAR8[strlen(FileName)]) != NULL) {
11430fdf1140b8d1ce93f3821d986fa165552023440lgao    for (Index = 0; FileName[Index] != '\"'; Index++) {
11530fdf1140b8d1ce93f3821d986fa165552023440lgao      mFileName[Index] = FileName[Index];
11630fdf1140b8d1ce93f3821d986fa165552023440lgao    }
11730fdf1140b8d1ce93f3821d986fa165552023440lgao    mFileName[Index] = '\0';
11830fdf1140b8d1ce93f3821d986fa165552023440lgao  }
11930fdf1140b8d1ce93f3821d986fa165552023440lgao
12030fdf1140b8d1ce93f3821d986fa165552023440lgao  return;
12130fdf1140b8d1ce93f3821d986fa165552023440lgao}
12230fdf1140b8d1ce93f3821d986fa165552023440lgao
12330fdf1140b8d1ce93f3821d986fa165552023440lgaoSVfrFileScopeRecord::~SVfrFileScopeRecord (
12430fdf1140b8d1ce93f3821d986fa165552023440lgao  VOID
12530fdf1140b8d1ce93f3821d986fa165552023440lgao  )
12630fdf1140b8d1ce93f3821d986fa165552023440lgao{
12730fdf1140b8d1ce93f3821d986fa165552023440lgao  if (mFileName != NULL) {
12830fdf1140b8d1ce93f3821d986fa165552023440lgao    delete mFileName;
12930fdf1140b8d1ce93f3821d986fa165552023440lgao  }
13030fdf1140b8d1ce93f3821d986fa165552023440lgao}
13130fdf1140b8d1ce93f3821d986fa165552023440lgao
13230fdf1140b8d1ce93f3821d986fa165552023440lgaoVOID
13330fdf1140b8d1ce93f3821d986fa165552023440lgaoCVfrErrorHandle::ParseFileScopeRecord (
13430fdf1140b8d1ce93f3821d986fa165552023440lgao  IN CHAR8     *Record,
13530fdf1140b8d1ce93f3821d986fa165552023440lgao  IN UINT32    WholeScopeLine
13630fdf1140b8d1ce93f3821d986fa165552023440lgao  )
13730fdf1140b8d1ce93f3821d986fa165552023440lgao{
13830fdf1140b8d1ce93f3821d986fa165552023440lgao  CHAR8               *FullPathName = NULL;
13930fdf1140b8d1ce93f3821d986fa165552023440lgao  SVfrFileScopeRecord *pNode        = NULL;
14030fdf1140b8d1ce93f3821d986fa165552023440lgao
14130fdf1140b8d1ce93f3821d986fa165552023440lgao  if (Record == NULL) {
14230fdf1140b8d1ce93f3821d986fa165552023440lgao    return;
14330fdf1140b8d1ce93f3821d986fa165552023440lgao  }
14430fdf1140b8d1ce93f3821d986fa165552023440lgao
14530fdf1140b8d1ce93f3821d986fa165552023440lgao  if ((pNode = new SVfrFileScopeRecord(Record, WholeScopeLine)) == NULL) {
14630fdf1140b8d1ce93f3821d986fa165552023440lgao    return;
14730fdf1140b8d1ce93f3821d986fa165552023440lgao  }
14830fdf1140b8d1ce93f3821d986fa165552023440lgao
14930fdf1140b8d1ce93f3821d986fa165552023440lgao  if (mScopeRecordListHead == NULL) {
15030fdf1140b8d1ce93f3821d986fa165552023440lgao    mScopeRecordListTail = mScopeRecordListHead = pNode;
15130fdf1140b8d1ce93f3821d986fa165552023440lgao  } else {
15230fdf1140b8d1ce93f3821d986fa165552023440lgao    mScopeRecordListTail->mNext = pNode;
15330fdf1140b8d1ce93f3821d986fa165552023440lgao    mScopeRecordListTail        = pNode;
15430fdf1140b8d1ce93f3821d986fa165552023440lgao  }
15530fdf1140b8d1ce93f3821d986fa165552023440lgao}
15630fdf1140b8d1ce93f3821d986fa165552023440lgao
15730fdf1140b8d1ce93f3821d986fa165552023440lgaoVOID
15830fdf1140b8d1ce93f3821d986fa165552023440lgaoCVfrErrorHandle::GetFileNameLineNum (
15930fdf1140b8d1ce93f3821d986fa165552023440lgao  IN  UINT32 LineNum,
16030fdf1140b8d1ce93f3821d986fa165552023440lgao  OUT CHAR8  **FileName,
16130fdf1140b8d1ce93f3821d986fa165552023440lgao  OUT UINT32 *FileLine
16230fdf1140b8d1ce93f3821d986fa165552023440lgao  )
16330fdf1140b8d1ce93f3821d986fa165552023440lgao{
16430fdf1140b8d1ce93f3821d986fa165552023440lgao  SVfrFileScopeRecord *pNode    = NULL;
16530fdf1140b8d1ce93f3821d986fa165552023440lgao
16630fdf1140b8d1ce93f3821d986fa165552023440lgao  if ((FileName == NULL) || (FileLine == NULL)) {
16730fdf1140b8d1ce93f3821d986fa165552023440lgao    return;
16830fdf1140b8d1ce93f3821d986fa165552023440lgao  }
16930fdf1140b8d1ce93f3821d986fa165552023440lgao
17030fdf1140b8d1ce93f3821d986fa165552023440lgao  *FileName = NULL;
17130fdf1140b8d1ce93f3821d986fa165552023440lgao  *FileLine = 0xFFFFFFFF;
17230fdf1140b8d1ce93f3821d986fa165552023440lgao
17330fdf1140b8d1ce93f3821d986fa165552023440lgao  //
17430fdf1140b8d1ce93f3821d986fa165552023440lgao  // Some errors occur before scope record list been built.
17530fdf1140b8d1ce93f3821d986fa165552023440lgao  //
17630fdf1140b8d1ce93f3821d986fa165552023440lgao  if (mScopeRecordListHead == NULL) {
17730fdf1140b8d1ce93f3821d986fa165552023440lgao    *FileLine = LineNum;
17830fdf1140b8d1ce93f3821d986fa165552023440lgao    *FileName = mInputFileName;
17930fdf1140b8d1ce93f3821d986fa165552023440lgao    return ;
18030fdf1140b8d1ce93f3821d986fa165552023440lgao  }
18130fdf1140b8d1ce93f3821d986fa165552023440lgao
18230fdf1140b8d1ce93f3821d986fa165552023440lgao  for (pNode = mScopeRecordListHead; pNode->mNext != NULL; pNode = pNode->mNext) {
18330fdf1140b8d1ce93f3821d986fa165552023440lgao    if ((LineNum > pNode->mWholeScopeLine) && (pNode->mNext->mWholeScopeLine > LineNum)) {
18430fdf1140b8d1ce93f3821d986fa165552023440lgao      *FileName = pNode->mFileName;
18530fdf1140b8d1ce93f3821d986fa165552023440lgao      *FileLine = LineNum - pNode->mWholeScopeLine + pNode->mScopeLineStart - 1;
18630fdf1140b8d1ce93f3821d986fa165552023440lgao      return ;
18730fdf1140b8d1ce93f3821d986fa165552023440lgao    }
18830fdf1140b8d1ce93f3821d986fa165552023440lgao  }
18930fdf1140b8d1ce93f3821d986fa165552023440lgao
19030fdf1140b8d1ce93f3821d986fa165552023440lgao  *FileName = pNode->mFileName;
19130fdf1140b8d1ce93f3821d986fa165552023440lgao  *FileLine = LineNum - pNode->mWholeScopeLine + pNode->mScopeLineStart - 1;
19230fdf1140b8d1ce93f3821d986fa165552023440lgao}
19330fdf1140b8d1ce93f3821d986fa165552023440lgao
19430fdf1140b8d1ce93f3821d986fa165552023440lgaoVOID
19530fdf1140b8d1ce93f3821d986fa165552023440lgaoCVfrErrorHandle::PrintMsg (
19630fdf1140b8d1ce93f3821d986fa165552023440lgao  IN UINT32               LineNum,
19730fdf1140b8d1ce93f3821d986fa165552023440lgao  IN CHAR8                *TokName,
19830fdf1140b8d1ce93f3821d986fa165552023440lgao  IN CHAR8                *MsgType,
19930fdf1140b8d1ce93f3821d986fa165552023440lgao  IN CHAR8                *ErrorMsg
20030fdf1140b8d1ce93f3821d986fa165552023440lgao  )
20130fdf1140b8d1ce93f3821d986fa165552023440lgao{
20230fdf1140b8d1ce93f3821d986fa165552023440lgao  CHAR8                  *FileName = NULL;
20330fdf1140b8d1ce93f3821d986fa165552023440lgao  UINT32                 FileLine;
204fd171542e0aa89ac12a09d79608173f48019b14bvanjeff
205fd171542e0aa89ac12a09d79608173f48019b14bvanjeff  if (strncmp ("Warning", MsgType, strlen ("Warning")) == 0) {
206fd171542e0aa89ac12a09d79608173f48019b14bvanjeff    VerboseMsg (ErrorMsg);
207fd171542e0aa89ac12a09d79608173f48019b14bvanjeff    return;
208fd171542e0aa89ac12a09d79608173f48019b14bvanjeff  }
20930fdf1140b8d1ce93f3821d986fa165552023440lgao  GetFileNameLineNum (LineNum, &FileName, &FileLine);
21030fdf1140b8d1ce93f3821d986fa165552023440lgao  Error (FileName, FileLine, 0x3000, TokName, "\t%s\n", ErrorMsg);
21130fdf1140b8d1ce93f3821d986fa165552023440lgao}
21230fdf1140b8d1ce93f3821d986fa165552023440lgao
21330fdf1140b8d1ce93f3821d986fa165552023440lgaoUINT8
21430fdf1140b8d1ce93f3821d986fa165552023440lgaoCVfrErrorHandle::HandleError (
21530fdf1140b8d1ce93f3821d986fa165552023440lgao  IN EFI_VFR_RETURN_CODE  ErrorCode,
21630fdf1140b8d1ce93f3821d986fa165552023440lgao  IN UINT32               LineNum,
21730fdf1140b8d1ce93f3821d986fa165552023440lgao  IN CHAR8                *TokName
21830fdf1140b8d1ce93f3821d986fa165552023440lgao  )
21930fdf1140b8d1ce93f3821d986fa165552023440lgao{
22030fdf1140b8d1ce93f3821d986fa165552023440lgao  UINT32                 Index;
22130fdf1140b8d1ce93f3821d986fa165552023440lgao  CHAR8                  *FileName = NULL;
22230fdf1140b8d1ce93f3821d986fa165552023440lgao  UINT32                 FileLine;
22330fdf1140b8d1ce93f3821d986fa165552023440lgao  CHAR8                  *ErrorMsg = NULL;
22430fdf1140b8d1ce93f3821d986fa165552023440lgao
22530fdf1140b8d1ce93f3821d986fa165552023440lgao  if (mVfrErrorHandleTable == NULL) {
22630fdf1140b8d1ce93f3821d986fa165552023440lgao    return 1;
22730fdf1140b8d1ce93f3821d986fa165552023440lgao  }
22830fdf1140b8d1ce93f3821d986fa165552023440lgao
22930fdf1140b8d1ce93f3821d986fa165552023440lgao  for (Index = 0; mVfrErrorHandleTable[Index].mErrorCode != VFR_RETURN_CODEUNDEFINED; Index++) {
23030fdf1140b8d1ce93f3821d986fa165552023440lgao    if (ErrorCode == mVfrErrorHandleTable[Index].mErrorCode) {
23130fdf1140b8d1ce93f3821d986fa165552023440lgao      ErrorMsg = mVfrErrorHandleTable[Index].mErrorMsg;
23230fdf1140b8d1ce93f3821d986fa165552023440lgao      break;
23330fdf1140b8d1ce93f3821d986fa165552023440lgao    }
23430fdf1140b8d1ce93f3821d986fa165552023440lgao  }
23530fdf1140b8d1ce93f3821d986fa165552023440lgao
23630fdf1140b8d1ce93f3821d986fa165552023440lgao  if (ErrorMsg != NULL) {
23730fdf1140b8d1ce93f3821d986fa165552023440lgao    GetFileNameLineNum (LineNum, &FileName, &FileLine);
23830fdf1140b8d1ce93f3821d986fa165552023440lgao    Error (FileName, FileLine, 0x3000, TokName, "\t%s\n", ErrorMsg);
23930fdf1140b8d1ce93f3821d986fa165552023440lgao    return 1;
24030fdf1140b8d1ce93f3821d986fa165552023440lgao  } else {
24130fdf1140b8d1ce93f3821d986fa165552023440lgao    return 0;
24230fdf1140b8d1ce93f3821d986fa165552023440lgao  }
24330fdf1140b8d1ce93f3821d986fa165552023440lgao}
24430fdf1140b8d1ce93f3821d986fa165552023440lgao
24530fdf1140b8d1ce93f3821d986fa165552023440lgaoCVfrErrorHandle gCVfrErrorHandle;
246