virtual zfindex outputLog(ZF_IN const zfchar *s, ZF_IN_OPT zfindex count = zfindexMax)
 {
     if(count == zfindexMax)
     {
         printf(zfTextA("%s"), ZFStringZ2A(s));
     }
     else
     {
         zfstring tmp(s, count);
         printf(zfTextA("%s"), ZFStringZ2A(tmp.cString()));
     }
     return zfindexMax;
 }
ZF_NAMESPACE_GLOBAL_BEGIN

static void _ZFP_ZFLog_ZFCoreLogExtFunc(ZF_IN const zfchar *callerFile,
                                        ZF_IN const zfchar *callerFunction,
                                        ZF_IN zfindex callerLine)
{
    if(zfLogStackTraceAvailable())
    {
        zfCoreLogTrim(ZFStringZ2A(zfLogStackTrace(zfnull, 2).cString()));
    }
}
    virtual ZFFileToken fileOpen(ZF_IN const zfchar *filePath,
                                 ZF_IN_OPT ZFFileOpenOptionFlags flag = ZFFileOpenOption::e_Read)
    {
        const zfcharA *sFlag = zfnull;
        if(ZFBitTest(flag, ZFFileOpenOption::e_Append))
        {
            if(ZFBitTest(flag, ZFFileOpenOption::e_Read))
            {
                sFlag = zfTextA("a+b");
            }
            else
            {
                sFlag = zfTextA("ab");
            }
        }
        else if(ZFBitTest(flag, ZFFileOpenOption::e_Create))
        {
            if(ZFBitTest(flag, ZFFileOpenOption::e_Read))
            {
                sFlag = zfText("w+b");
            }
            else
            {
                sFlag = zfText("wb");
            }
        }
        else if(ZFBitTest(flag, ZFFileOpenOption::e_Write))
        {
            if(ZFBitTest(flag, ZFFileOpenOption::e_Read))
            {
                sFlag = zfTextA("r+b");
            }
            else
            {
                sFlag = zfTextA("wb");
            }
        }
        else if(ZFBitTest(flag, ZFFileOpenOption::e_Read))
        {
            sFlag = zfTextA("rb");
        }
        else
        {
            zfCoreCriticalShouldNotGoHere();
            return ZFFileTokenInvalid;
        }

        #if ZF_ENV_sys_Windows
            zfstringW _filePathSaved = ZFStringZ2W(filePath);
            DWORD _fileAttrSaved = ::GetFileAttributesW(_filePathSaved.cString());
            ::SetFileAttributesW(_filePathSaved.cString(), FILE_ATTRIBUTE_NORMAL);
        #endif

        ZFFileToken ret = (ZFFileToken)(::fopen(ZFStringZ2A(filePath), sFlag));

        #if ZF_ENV_sys_Windows
            ::SetFileAttributesW(_filePathSaved.cString(), _fileAttrSaved);
        #endif

        return ret;
    }