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