2 * This file is part of MPlayer.
4 * MPlayer is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * MPlayer is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 /// \ingroup OptionsStruct
32 m_struct_get_field(const m_struct_t
* st
,const char* f
) {
35 for(i
= 0 ; st
->fields
[i
].name
; i
++) {
36 if(strcasecmp(st
->fields
[i
].name
,f
) == 0)
37 return &st
->fields
[i
];
43 m_struct_alloc(const m_struct_t
* st
) {
48 mp_msg(MSGT_CFGPARSER
, MSGL_ERR
,"Struct %s needs defaults\n",st
->name
);
52 r
= calloc(1,st
->size
);
53 memcpy(r
,st
->defaults
,st
->size
);
55 for(i
= 0 ; st
->fields
[i
].name
; i
++) {
56 if(st
->fields
[i
].type
->flags
& M_OPT_TYPE_DYNAMIC
)
57 memset(M_ST_MB_P(r
,st
->fields
[i
].p
),0,st
->fields
[i
].type
->size
);
58 m_option_copy(&st
->fields
[i
],M_ST_MB_P(r
,st
->fields
[i
].p
),M_ST_MB_P(st
->defaults
,st
->fields
[i
].p
));
63 int m_struct_set(const m_struct_t
*st
, void *obj
, const char *field
,
66 const m_option_t
* f
= m_struct_get_field(st
,field
);
69 mp_msg(MSGT_CFGPARSER
, MSGL_ERR
,"Struct %s doesn't have any %s field\n",
74 if(f
->type
->parse(f
, bstr(field
), param
, false, M_ST_MB_P(obj
,f
->p
), NULL
) < 0) {
75 mp_msg(MSGT_CFGPARSER
, MSGL_ERR
,"Struct %s, field %s parsing error: %.*s\n",
76 st
->name
, field
, BSTR_P(param
));
84 m_struct_reset(const m_struct_t
* st
, void* obj
, const char* field
) {
87 if(!field
) { // Reset all options
89 for(i
= 0 ; st
->fields
[i
].name
; i
++)
90 m_option_copy(&st
->fields
[i
],M_ST_MB_P(obj
,st
->fields
[i
].p
),M_ST_MB_P(st
->defaults
,st
->fields
[i
].p
));
95 f
= m_struct_get_field(st
,field
);
97 mp_msg(MSGT_CFGPARSER
, MSGL_ERR
,"Struct %s doesn't have any %s field\n",
101 m_option_copy(f
,M_ST_MB_P(obj
,f
->p
),M_ST_MB_P(st
->defaults
,f
->p
));
104 /// Free an allocated struct
106 m_struct_free(const m_struct_t
* st
, void* obj
) {
109 for(i
= 0 ; st
->fields
[i
].name
; i
++)
110 m_option_free(&st
->fields
[i
],M_ST_MB_P(obj
,st
->fields
[i
].p
));
115 m_struct_copy(const m_struct_t
* st
, void* obj
) {
116 void* r
= malloc(st
->size
);
119 memcpy(r
,obj
,st
->size
);
120 for(i
= 0 ; st
->fields
[i
].name
; i
++) {
121 if(st
->fields
[i
].type
->flags
& M_OPT_TYPE_DYNAMIC
)
122 memset(M_ST_MB_P(r
,st
->fields
[i
].p
),0,st
->fields
[i
].type
->size
);
123 m_option_copy(&st
->fields
[i
],M_ST_MB_P(r
,st
->fields
[i
].p
),M_ST_MB_P(obj
,st
->fields
[i
].p
));