/*lint -e960 */
VOS_VOID SC_Printf(const VOS_CHAR *pcformat, ...)
/*lint +e960 */
{
    VOS_CHAR                            aucIMEILogFilePath[100];
    VOS_CHAR                            acOutput[SC_LOG_MAX_LEN];
    va_list                             argument;
    VOS_UINT32                          ulRetLen;
    FILE                               *fp;
    VOS_UINT32                          ulFileSize;

    /* 将格式化字符串和可变参数转换为字符串 */
    va_start(argument, pcformat);
    ulRetLen = (VOS_UINT32)vsnprintf(acOutput, SC_LOG_MAX_LEN, pcformat, argument);
    va_end(argument);

    if ((SC_LOG_MAX_LEN < ulRetLen) || (0 == ulRetLen))
    {
        return ;
    }

    if (VOS_OK != OM_GetLogPath(aucIMEILogFilePath, SC_IMEI_LOG_FILE_PATH, SC_IMEI_UNITARY_LOG_FILE_PATH))
    {
        return ;
    }

#if ((VOS_WIN32 == VOS_OS_VER)||(VOS_VXWORKS == VOS_OS_VER)||(VOS_RTOSCK == VOS_OS_VER))
    fp = DRV_FILE_OPEN(aucIMEILogFilePath, "a");

    if (VOS_NULL_PTR == fp)
    {
        return ;
    }

    (VOS_VOID)DRV_FILE_LSEEK(fp, 0, SC_FILE_SEEK_END);

    ulFileSize = (VOS_UINT32)DRV_FILE_TELL(fp);

    /* If the log file is too large, we need empty it. */
    if (ulFileSize > SC_LOG_FILE_MAX_SIZE)
    {
        DRV_FILE_CLOSE(fp);
        fp = DRV_FILE_OPEN(aucIMEILogFilePath, "w");

        if (VOS_NULL_PTR == fp)
        {
            return ;
        }
    }

    DRV_FILE_WRITE(acOutput, ulRetLen, 1, fp);

    DRV_FILE_CLOSE(fp);

#endif

    return ;
}
/*****************************************************************************
函 数 名  : USIMM_File_Seek
功能描述  : 重定位文件指针
输入参数  : Fp       --- 文件句柄
            lOffset  --- 偏移量
            lWhence  --- 偏移起始位置
输出参数  : 无
返 回 值  : SI_UINT32 函数执行结果
调用函数  :
被调函数  : 外部接口

修改历史      :
1.日    期  : 2013年08月28日
  作    者  : zhuli
  修改内容  : Create
*****************************************************************************/
VOS_INT32 USIMM_File_Seek( FILE *Fp,VOS_INT32 lOffset,VOS_INT32 lWhence)
{
    VOS_INT32 ulRslt = VOS_ERR;

    ulRslt = DRV_FILE_LSEEK(Fp,lOffset,lWhence);

    if ( VOS_OK != ulRslt )
    {
        USIMM_WARNING_LOG("Seek File fail!");
    }

    return ulRslt;
}
/*****************************************************************************
Function   : NV_File_Seek
Description: Set the file position indicator
Input      : FILE *Fp -> File position
             VOS_INT32 lOffset -> Offset from lWhence
             VOS_INT32 lWhence -> Position to offset from
Return     : OK or ERR
Other      :
*****************************************************************************/
VOS_INT32 NV_File_Seek( FILE *Fp,VOS_INT32 lOffset,VOS_INT32 lWhence)
{
    VOS_INT32 ulRslt = VOS_ERR;

    ulRslt = DRV_FILE_LSEEK(Fp,lOffset,lWhence);

    if ( VOS_OK != ulRslt )
    {
        NV_Printf("NV:Seek File fail.\r\n");
    }

    return ulRslt;
}
/*****************************************************************************
 Prototype       : OM_WriteLogProc
 Description     : 处理ACPU发来的write Log请求
 Input           : pMsg - 指向消息地址
 Output          : None
 Return Value    : VOS_VOID

 History         : ---
    Date         : 2012-05-08
    Author       : zhuli
    Modification : Created function
 *****************************************************************************/
VOS_VOID OM_WriteLogProc(MsgBlock* pMsg)
{
    OM_WRITELOG_REQ_STRU    *pstLogReq;
    VOS_UINT32              ulLen;
    FILE                    *fp;

    pstLogReq = (OM_WRITELOG_REQ_STRU*)pMsg;

    fp = DRV_FILE_OPEN((VOS_CHAR*)pstLogReq->aucFileName, "ab+");  /*按照追加方式打开文件*/

    if(VOS_NULL_PTR == fp)                      /*如果文件打开失败说明建立文件也不成功*/
    {
        return;
    }

    (VOS_VOID)DRV_FILE_LSEEK(fp, 0, DRV_SEEK_END);

    ulLen = (VOS_UINT32)DRV_FILE_TELL(fp);

    if(ulLen >= OM_LOG_FILE_MAX_SIZE)            /*文件大小超过限制*/
    {
        DRV_FILE_CLOSE(fp);

        fp = DRV_FILE_OPEN((VOS_CHAR*)pstLogReq->aucFileName, "wb+");  /*清空文件内容*/
    }

    if(VOS_NULL_PTR == fp)                      /*如果文件打开失败说明建立文件也不成功*/
    {
        return;
    }

    DRV_FILE_WRITE(pstLogReq->aucData, sizeof(VOS_CHAR), pstLogReq->ulLen, fp);

    DRV_FILE_CLOSE(fp);

    return;
}
VOS_UINT32 NV_Printf(const VOS_CHAR *pcformat, ...)
/*lint +e960 */
{
    VOS_CHAR                            acOutput[NV_LOG_MAX_LEN];
    va_list                             argument;
    VOS_UINT32                          ulRetLen;
#if ((VOS_WIN32 == VOS_OS_VER)||(VOS_VXWORKS == VOS_OS_VER)||(VOS_RTOSCK == VOS_OS_VER))
    FILE                               *fp;
    VOS_UINT32                          ulFileSize;
#endif

    /* 将格式化字符串和可变参数转换为字符串 */
    va_start(argument, pcformat);
    ulRetLen = (VOS_UINT32)vsnprintf(acOutput, NV_LOG_MAX_LEN, pcformat, argument);
    va_end(argument);

    if ((NV_LOG_MAX_LEN < ulRetLen) || (0 == ulRetLen))
    {
        return VOS_ERR;
    }

#if (VOS_LINUX == VOS_OS_VER)
    printk("%s", acOutput);
#elif (VOS_VXWORKS == VOS_OS_VER)
    logMsg("%s", acOutput);
#elif (VOS_RTOSCK == VOS_OS_VER)
    SRE_Printf("%s", acOutput);
#endif

#if ((VOS_WIN32 == VOS_OS_VER)||(VOS_VXWORKS == VOS_OS_VER)||(VOS_RTOSCK == VOS_OS_VER))
    fp = DRV_FILE_OPEN(g_acNvLogFilePath, "a");

    if (VOS_NULL_PTR == fp)
    {
        return VOS_ERR;
    }

    DRV_FILE_LSEEK(fp, 0, NV_FILE_SEEK_END);

    ulFileSize = (VOS_UINT32)DRV_FILE_TELL(fp);

    /* If the log file is too large, we need empty it. */
    if (ulFileSize > NV_LOG_FILE_MAX_SIZE)
    {
        DRV_FILE_CLOSE(fp);
        fp = DRV_FILE_OPEN(g_acNvLogFilePath, "w");

        if (VOS_NULL_PTR == fp)
        {
            return VOS_ERR;
        }
    }

    DRV_FILE_WRITE(acOutput, ulRetLen, 1, fp);

    DRV_FILE_CLOSE(fp);

#endif

    return VOS_OK;
}