📄 messages.c
字号:
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 + -