⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 messages.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 2 页
字号:
        char psz_err[1001];#ifndef WIN32        /* we're not using GLIBC, so we are sure that the error description         * will be stored in the buffer we provide to strerror_r() */        strerror_r( errno, psz_err, 1001 );#else        strncpy( psz_err, strerror( errno ), 1001 );#endif        psz_err[1000] = '\0';        fprintf( stderr, "main warning: can't store message (%s): ", psz_err );#endif        vlc_va_copy( args, _args );        /* We should use utf8_vfprintf - but it calls malloc()... */        vfprintf( stderr, psz_format, args );        va_end( args );        fputs( "\n", stderr );        return;    }    i_header_size = 0;    p_obj = p_this;    while( p_obj != NULL )    {        char *psz_old = NULL;        if( p_obj->psz_header )        {            i_header_size += strlen( p_obj->psz_header ) + 4;            if( psz_header )            {                psz_old = strdup( psz_header );                psz_header = (char*)realloc( psz_header, i_header_size );                snprintf( psz_header, i_header_size , "[%s] %s",                          p_obj->psz_header, psz_old );            }            else            {                psz_header = (char *)malloc( i_header_size );                snprintf( psz_header, i_header_size, "[%s]",                          p_obj->psz_header );            }        }        free( psz_old );        p_obj = p_obj->p_parent;    }#if !defined(HAVE_VASPRINTF) || defined(__APPLE__) || defined(SYS_BEOS)    vlc_va_copy( args, _args );    vsnprintf( psz_str, i_size, psz_format, args );    va_end( args );    psz_str[ i_size - 1 ] = 0; /* Just in case */#endif    LOCK_BANK;    p_queue = &QUEUE;    vlc_mutex_lock( &p_queue->lock );    /* Check there is room in the queue for our message */    if( p_queue->b_overflow )    {        FlushMsg( p_queue );        if( ((p_queue->i_stop - p_queue->i_start + 1) % VLC_MSG_QSIZE) == 0 )        {            /* Still in overflow mode, print from a dummy item */            p_item = &item;        }        else        {            /* Pheeew, at last, there is room in the queue! */            p_queue->b_overflow = false;        }    }    else if( ((p_queue->i_stop - p_queue->i_start + 2) % VLC_MSG_QSIZE) == 0 )    {        FlushMsg( p_queue );        if( ((p_queue->i_stop - p_queue->i_start + 2) % VLC_MSG_QSIZE) == 0 )        {            p_queue->b_overflow = true;            /* Put the overflow message in the queue */            p_item = p_queue->msg + p_queue->i_stop;            p_queue->i_stop = (p_queue->i_stop + 1) % VLC_MSG_QSIZE;            p_item->i_type =        VLC_MSG_WARN;            p_item->i_object_id =   p_this->i_object_id;            p_item->psz_object_type = p_this->psz_object_type;            p_item->psz_module =    strdup( "message" );            p_item->psz_msg =       strdup( "message queue overflowed" );            p_item->psz_header =    NULL;            PrintMsg( p_this, p_item );            /* We print from a dummy item */            p_item = &item;        }    }    if( !p_queue->b_overflow )    {        /* Put the message in the queue */        p_item = p_queue->msg + p_queue->i_stop;        p_queue->i_stop = (p_queue->i_stop + 1) % VLC_MSG_QSIZE;    }    /* Fill message information fields */    p_item->i_type =        i_type;    p_item->i_object_id =   p_this->i_object_id;    p_item->psz_object_type = p_this->psz_object_type;    p_item->psz_module =    strdup( psz_module );    p_item->psz_msg =       psz_str;    p_item->psz_header =    psz_header;    PrintMsg( p_this, p_item );    if( p_queue->b_overflow )    {        free( p_item->psz_module );        free( p_item->psz_msg );        free( p_item->psz_header );    }    vlc_mutex_unlock ( &p_queue->lock );    UNLOCK_BANK;}/* following functions are local *//***************************************************************************** * FlushMsg ***************************************************************************** * Print all messages remaining in queue. MESSAGE QUEUE MUST BE LOCKED, since * this function does not check the lock. *****************************************************************************/static void FlushMsg ( msg_queue_t *p_queue ){    int i_index, i_start, i_stop;    /* Get the maximum message index that can be freed */    i_stop = p_queue->i_stop;    /* Check until which value we can free messages */    for( i_index = 0; i_index < p_queue->i_sub; i_index++ )    {        i_start = p_queue->pp_sub[ i_index ]->i_start;        /* If this subscriber is late, we don't free messages before         * his i_start value, otherwise he'll miss messages */        if(   ( i_start < i_stop               && (p_queue->i_stop <= i_start || i_stop <= p_queue->i_stop) )           || ( i_stop < i_start               && (i_stop <= p_queue->i_stop && p_queue->i_stop <= i_start) ) )        {            i_stop = i_start;        }    }    /* Free message data */    for( i_index = p_queue->i_start;         i_index != i_stop;         i_index = (i_index+1) % VLC_MSG_QSIZE )    {        free( p_queue->msg[i_index].psz_msg );        free( p_queue->msg[i_index].psz_module );        free( p_queue->msg[i_index].psz_header );    }    /* Update the new start value */    p_queue->i_start = i_index;}/***************************************************************************** * PrintMsg: output a standard message item to stderr ***************************************************************************** * Print a message to stderr, with colour formatting if needed. *****************************************************************************/static void PrintMsg ( vlc_object_t * p_this, msg_item_t * p_item ){#   define COL(x)  "\033[" #x ";1m"#   define RED     COL(31)#   define GREEN   COL(32)#   define YELLOW  COL(33)#   define WHITE   COL(0)#   define GRAY    "\033[0m"#ifdef UNDER_CE    int i_dummy;#endif    static const char ppsz_type[4][9] = { "", " error", " warning", " debug" };    static const char ppsz_color[4][8] = { WHITE, RED, YELLOW, GRAY };    const char *psz_object;    libvlc_priv_t *priv = libvlc_priv (p_this->p_libvlc);    int i_type = p_item->i_type;    switch( i_type )    {        case VLC_MSG_ERR:            if( priv->i_verbose < 0 ) return;            break;        case VLC_MSG_INFO:            if( priv->i_verbose < 0 ) return;            break;        case VLC_MSG_WARN:            if( priv->i_verbose < 1 ) return;            break;        case VLC_MSG_DBG:            if( priv->i_verbose < 2 ) return;            break;    }    psz_object = p_item->psz_object_type;#ifdef UNDER_CE#   define CE_WRITE(str) WriteFile( QUEUE.logfile, \                                    str, strlen(str), &i_dummy, NULL );    CE_WRITE( p_item->psz_module );    CE_WRITE( " " );    CE_WRITE( psz_object );    CE_WRITE( ppsz_type[i_type] );    CE_WRITE( ": " );    CE_WRITE( p_item->psz_msg );    CE_WRITE( "\r\n" );    FlushFileBuffers( QUEUE.logfile );#else    /* Send the message to stderr */    if( priv->b_color )    {        if( p_item->psz_header )        {            utf8_fprintf( stderr, "[" GREEN "%.8i" GRAY "] %s %s %s%s: %s%s" GRAY                              "\n",                         p_item->i_object_id, p_item->psz_header,                         p_item->psz_module, psz_object,                         ppsz_type[i_type], ppsz_color[i_type],                         p_item->psz_msg );        }        else        {             utf8_fprintf( stderr, "[" GREEN "%.8i" GRAY "] %s %s%s: %s%s" GRAY "\n",                         p_item->i_object_id, p_item->psz_module, psz_object,                         ppsz_type[i_type], ppsz_color[i_type],                         p_item->psz_msg );        }    }    else    {        if( p_item->psz_header )        {            utf8_fprintf( stderr, "[%.8i] %s %s %s%s: %s\n", p_item->i_object_id,                         p_item->psz_header, p_item->psz_module,                         psz_object, ppsz_type[i_type], p_item->psz_msg );        }        else        {            utf8_fprintf( stderr, "[%.8i] %s %s%s: %s\n", p_item->i_object_id,                         p_item->psz_module, psz_object, ppsz_type[i_type],                         p_item->psz_msg );        }    }#   if defined(WIN32)    fflush( stderr );#   endif#endif}static msg_context_t* GetContext(void){    msg_context_t *p_ctx = vlc_threadvar_get( &msg_context_global_key );    if( p_ctx == NULL )    {        MALLOC_NULL( p_ctx, msg_context_t );        p_ctx->psz_message = NULL;        vlc_threadvar_set( &msg_context_global_key, p_ctx );    }    return p_ctx;}void msg_StackDestroy (void *data){    msg_context_t *p_ctx = data;    free (p_ctx->psz_message);    free (p_ctx);}void msg_StackSet( int i_code, const char *psz_message, ... ){    va_list ap;    msg_context_t *p_ctx = GetContext();    if( p_ctx == NULL )        return;    free( p_ctx->psz_message );    va_start( ap, psz_message );    if( vasprintf( &p_ctx->psz_message, psz_message, ap ) == -1 )        p_ctx->psz_message = NULL;    va_end( ap );    p_ctx->i_code = i_code;}void msg_StackAdd( const char *psz_message, ... ){    char *psz_tmp;    va_list ap;    msg_context_t *p_ctx = GetContext();    if( p_ctx == NULL )        return;    va_start( ap, psz_message );    if( vasprintf( &psz_tmp, psz_message, ap ) == -1 )        psz_tmp = NULL;    va_end( ap );    if( !p_ctx->psz_message )        p_ctx->psz_message = psz_tmp;    else    {        char *psz_new;        if( asprintf( &psz_new, "%s: %s", psz_tmp, p_ctx->psz_message ) == -1 )            psz_new = NULL;        free( p_ctx->psz_message );        p_ctx->psz_message = psz_new;        free( psz_tmp );    }}const char* msg_StackMsg( void ){    msg_context_t *p_ctx = GetContext();    assert( p_ctx );    return p_ctx->psz_message;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -