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

📄 osd_parser.c

📁 uclinux 下的vlc播放器源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
        path[MAX_FILE_PATH-1] = '\0';        i_len = strlen(&path[0]);        if( i_len == MAX_FILE_PATH )            i_len--; /* truncate to prevent buffer overflow */#if defined(WIN32) || defined(UNDER_CE)        if( (i_len > 0) && path[i_len] != '\\' )            path[i_len] = '\\';#else        if( (i_len > 0) && path[i_len] != '/' )            path[i_len] = '/';#endif        path[i_len+1] = '\0';        if( result == 0 || result == EOF )            goto error;        msg_Dbg( p_this, "%s=%s", &action[0], &path[0] );        if( i_len == 0 )            *p_menu = osd_MenuNew( *p_menu, NULL, 0, 0 );        else            *p_menu = osd_MenuNew( *p_menu, &path[0], 0, 0 );    }    if( !*p_menu )        goto error;    /* read successive lines */    while( !feof( fd ) )    {        osd_state_t   *p_state_current = NULL; /* button state currently processed */        osd_state_t   *p_state_prev = NULL;    /* previous state processed button */        char cmd[25] = "";        char action[25] = "";        char state[25]  = "";        char file[256]  = "";        char path[512]  = "";        int  i_x = 0;        int  i_y = 0;        result = fscanf( fd, "%24s %24s (%d,%d)", &cmd[0], &action[0], &i_x, &i_y );        if( result == 0 )            goto error;        if( strncmp( &cmd[0], "action", 6 ) != 0 )            break;        msg_Dbg( p_this, " + %s hotkey=%s (%d,%d)", &cmd[0], &action[0], i_x, i_y );        p_prev = p_current;        p_current = osd_ButtonNew( &action[0], i_x, i_y );        if( !p_current )            goto error;        if( p_prev )            p_prev->p_next = p_current;        else            (*p_menu)->p_button = p_current;        p_current->p_prev = p_prev;        /* parse all states */        while( !feof( fd ) )        {            char type[25] = "";            result = fscanf( fd, "\t%24s", &state[0] );            if( result == 0 )                goto error;            /* FIXME: We only parse one level deep now */            if( strncmp( &state[0], "action", 6 ) == 0 )            {                osd_button_t   *p_up = NULL;                result = fscanf( fd, "%24s (%d,%d)", &action[0], &i_x, &i_y );                if( result == 0 )                    goto error;                /* create new button */                p_up = osd_ButtonNew( &action[0], i_x, i_y );                if( !p_up )                    goto error;                /* Link to list */                p_up->p_down = p_current;                p_current->p_up = p_up;                msg_Dbg( p_this, " + (menu up) hotkey=%s (%d,%d)", &action[0], i_x, i_y );                /* Parse type state */                result = fscanf( fd, "\t%24s %24s", &cmd[0], &type[0] );                if( result == 0 )                    goto error;                if( strncmp( &cmd[0], "type", 4 ) == 0 )                {                    if( strncmp( &type[0], "volume", 6 ) == 0 )                    {                        (*p_menu)->p_state->p_volume = p_up;                        msg_Dbg( p_this, " + type=%s", &type[0] );                    }                }                /* Parse range state */                result = fscanf( fd, "\t%24s", &state[0] );                if( result == 0 )                    goto error;                /* Parse the range state */                if( strncmp( &state[0], "range", 5 ) == 0 )                {                    osd_state_t   *p_range_current = NULL; /* range state currently processed */                    osd_state_t   *p_range_prev = NULL;    /* previous state processed range */                    int i_index = 0;                    p_up->b_range = VLC_TRUE;                    result = fscanf( fd, "\t%24s", &action[0] );                    if( result == 0 )                        goto error;                    result = fscanf( fd, "\t%d", &i_index );                    if( result == 0 )                        goto error;                    msg_Dbg( p_this, " + (menu up) hotkey down %s, file=%s%s", &action[0], (*p_menu)->psz_path, &file[0] );                    if( p_up->psz_action_down ) free( p_up->psz_action_down );                    p_up->psz_action_down = strdup( &action[0] );                    /* Parse range contstruction :                     * range <hotkey>                     *      <state1> <file1>                     *                     *      <stateN> <fileN>                     * end                     */                    while( !feof( fd ) )                    {                        result = fscanf( fd, "\t%255s", &file[0] );                        if( result == 0 )                            goto error;                        if( strncmp( &file[0], "end", 3 ) == 0 )                            break;                        p_range_prev = p_range_current;                        if( (*p_menu)->psz_path )                        {                            size_t i_path_size = strlen( (*p_menu)->psz_path );                            size_t i_file_size = strlen( &file[0] );                            strncpy( &path[0], (*p_menu)->psz_path, i_path_size );                            strncpy( &path[i_path_size], &file[0], 512 - (i_path_size + i_file_size) );                            path[ i_path_size + i_file_size ] = '\0';                            p_range_current = osd_StateNew( p_this, &path[0], "pressed" );                        }                        else /* absolute paths are used. */                            p_range_current = osd_StateNew( p_this, &file[0], "pressed" );                        if( !p_range_current || !p_range_current->p_pic )                            goto error;                        /* increment the number of ranges for this button */                        p_up->i_ranges++;                        if( p_range_prev )                            p_range_prev->p_next = p_range_current;                        else                            p_up->p_states = p_range_current;                        p_range_current->p_prev = p_range_prev;                        msg_Dbg( p_this, "  |- range=%d, file=%s%s",                                p_up->i_ranges,                                (*p_menu)->psz_path, &file[0] );                    }                    if( i_index > 0 )                    {                        osd_state_t *p_range = NULL;                        /* Find the default index for state range */                        p_range = p_up->p_states;                        while( (--i_index > 0) && p_range->p_next )                        {                            osd_state_t *p_temp = NULL;                            p_temp = p_range->p_next;                            p_range = p_temp;                        }                        p_up->p_current_state = p_range;                    }                    else p_up->p_current_state = p_up->p_states;                }                result = fscanf( fd, "\t%24s", &state[0] );                if( result == 0 )                    goto error;                if( strncmp( &state[0], "end", 3 ) != 0 )                    goto error;                /* Continue at the beginning of the while() */                continue;            }            /* Parse the range state */            if( strncmp( &state[0], "range", 5 ) == 0 )            {                osd_state_t   *p_range_current = NULL; /* range state currently processed */                osd_state_t   *p_range_prev = NULL;    /* previous state processed range */                int i_index = 0;                p_current->b_range = VLC_TRUE;                result = fscanf( fd, "\t%24s", &action[0] );                if( result == 0 )                    goto error;                result = fscanf( fd, "\t%d", &i_index );                if( result == 0 )                    goto error;                msg_Dbg( p_this, " + hotkey down %s, file=%s%s", &action[0], (*p_menu)->psz_path, &file[0] );                if( p_current->psz_action_down ) free( p_current->psz_action_down );                p_current->psz_action_down = strdup( &action[0] );                /* Parse range contstruction :                 * range <hotkey>                 *      <state1> <file1>                 *                 *      <stateN> <fileN>                 * end                 */                while( !feof( fd ) )                {                    result = fscanf( fd, "\t%255s", &file[0] );                    if( result == 0 )                        goto error;                    if( strncmp( &file[0], "end", 3 ) == 0 )                        break;                    p_range_prev = p_range_current;                    if( (*p_menu)->psz_path )                    {                        size_t i_path_size = strlen( (*p_menu)->psz_path );                        size_t i_file_size = strlen( &file[0] );                        strncpy( &path[0], (*p_menu)->psz_path, i_path_size );                        strncpy( &path[i_path_size], &file[0], 512 - (i_path_size + i_file_size) );                        path[ i_path_size + i_file_size ] = '\0';                        p_range_current = osd_StateNew( p_this, &path[0], "pressed" );                    }                    else /* absolute paths are used. */                        p_range_current = osd_StateNew( p_this, &file[0], "pressed" );                    if( !p_range_current || !p_range_current->p_pic )                        goto error;                    /* increment the number of ranges for this button */                    p_current->i_ranges++;                    if( p_range_prev )                        p_range_prev->p_next = p_range_current;                    else                        p_current->p_states = p_range_current;                    p_range_current->p_prev = p_range_prev;                    msg_Dbg( p_this, "  |- range=%d, file=%s%s",                            p_current->i_ranges,                            (*p_menu)->psz_path, &file[0] );                }                if( i_index > 0 )                {                    osd_state_t *p_range = NULL;                    /* Find the default index for state range */                    p_range = p_current->p_states;                    while( (--i_index > 0) && p_range->p_next )                    {                        osd_state_t *p_temp = NULL;                        p_temp = p_range->p_next;                        p_range = p_temp;                    }                    p_current->p_current_state = p_range;                }                else p_current->p_current_state = p_current->p_states;                /* Continue at the beginning of the while() */                continue;            }            if( strncmp( &state[0], "end", 3 ) == 0 )                break;            result = fscanf( fd, "\t%255s", &file[0] );            if( result == 0 )                goto error;            p_state_prev = p_state_current;            if( ( strncmp( ppsz_button_states[0], &state[0], strlen(ppsz_button_states[0]) ) != 0 ) &&                ( strncmp( ppsz_button_states[1], &state[0], strlen(ppsz_button_states[1]) ) != 0 ) &&                ( strncmp( ppsz_button_states[2], &state[0], strlen(ppsz_button_states[2]) ) != 0 ) )            {                msg_Err( p_this, "invalid button state %s for button %s expected %d: unselect, select or pressed)",                                    &state[0], &action[0], strlen(&state[0]));                goto error;            }            if( (*p_menu)->psz_path )            {                size_t i_path_size = strlen( (*p_menu)->psz_path );                size_t i_file_size = strlen( &file[0] );                strncpy( &path[0], (*p_menu)->psz_path, i_path_size );                strncpy( &path[i_path_size], &file[0], 512 - (i_path_size + i_file_size) );                path[ i_path_size + i_file_size ] = '\0';                p_state_current = osd_StateNew( p_this, &path[0], &state[0] );            }            else /* absolute paths are used. */                p_state_current = osd_StateNew( p_this, &file[0], &state[0] );            if( !p_state_current || !p_state_current->p_pic )                goto error;            if( p_state_prev )                p_state_prev->p_next = p_state_current;            else                p_current->p_states = p_state_current;            p_state_current->p_prev = p_state_prev;            msg_Dbg( p_this, " |- state=%s, file=%s%s", &state[0], (*p_menu)->psz_path, &file[0] );        }        p_current->p_current_state = p_current->p_states;    }    /* Find the last button and store its pointer.     * The OSD menu behaves like a roundrobin list.     */    p_current = (*p_menu)->p_button;    while( p_current && p_current->p_next )    {        osd_button_t *p_temp = NULL;        p_temp = p_current->p_next;        p_current = p_temp;    }    (*p_menu)->p_last_button = p_current;    fclose( fd );    return 0;#undef MAX_FILE_PATHerror:    msg_Err( p_this, "parsing file failed (returned %d)", result );    fclose( fd );    return 1;}/***************************************************************************** * osd_ConfigUnload: Load and parse osd text configurationfile *****************************************************************************/void osd_ConfigUnload( vlc_object_t *p_this, osd_menu_t **p_osd){    msg_Dbg( p_this, "unloading OSD menu structure" );    osd_MenuFree( p_this, *p_osd );}

⌨️ 快捷键说明

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