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
);
51 // Check the struct fields
52 for(i
= 0 ; st
->fields
[i
].name
; i
++) {
53 if(st
->fields
[i
].type
->flags
& M_OPT_TYPE_INDIRECT
) {
54 mp_msg(MSGT_CFGPARSER
, MSGL_ERR
,"Struct %s->%s: Option types with the indirect flag are forbidden.\n",st
->name
,st
->fields
[i
].name
);
59 r
= calloc(1,st
->size
);
60 memcpy(r
,st
->defaults
,st
->size
);
62 for(i
= 0 ; st
->fields
[i
].name
; i
++) {
63 if(st
->fields
[i
].type
->flags
& M_OPT_TYPE_DYNAMIC
)
64 memset(M_ST_MB_P(r
,st
->fields
[i
].p
),0,st
->fields
[i
].type
->size
);
65 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
));
70 int m_struct_set(const m_struct_t
*st
, void *obj
, const char *field
,
73 const m_option_t
* f
= m_struct_get_field(st
,field
);
76 mp_msg(MSGT_CFGPARSER
, MSGL_ERR
,"Struct %s doesn't have any %s field\n",
81 if(f
->type
->parse(f
, bstr(field
), param
, false, M_ST_MB_P(obj
,f
->p
)) < 0) {
82 mp_msg(MSGT_CFGPARSER
, MSGL_ERR
,"Struct %s, field %s parsing error: %.*s\n",
83 st
->name
, field
, BSTR_P(param
));
91 m_struct_reset(const m_struct_t
* st
, void* obj
, const char* field
) {
94 if(!field
) { // Reset all options
96 for(i
= 0 ; st
->fields
[i
].name
; i
++)
97 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
));
102 f
= m_struct_get_field(st
,field
);
104 mp_msg(MSGT_CFGPARSER
, MSGL_ERR
,"Struct %s doesn't have any %s field\n",
108 m_option_copy(f
,M_ST_MB_P(obj
,f
->p
),M_ST_MB_P(st
->defaults
,f
->p
));
111 /// Free an allocated struct
113 m_struct_free(const m_struct_t
* st
, void* obj
) {
116 for(i
= 0 ; st
->fields
[i
].name
; i
++)
117 m_option_free(&st
->fields
[i
],M_ST_MB_P(obj
,st
->fields
[i
].p
));
122 m_struct_copy(const m_struct_t
* st
, void* obj
) {
123 void* r
= malloc(st
->size
);
126 memcpy(r
,obj
,st
->size
);
127 for(i
= 0 ; st
->fields
[i
].name
; i
++) {
128 if(st
->fields
[i
].type
->flags
& M_OPT_TYPE_DYNAMIC
)
129 memset(M_ST_MB_P(r
,st
->fields
[i
].p
),0,st
->fields
[i
].type
->size
);
130 m_option_copy(&st
->fields
[i
],M_ST_MB_P(r
,st
->fields
[i
].p
),M_ST_MB_P(obj
,st
->fields
[i
].p
));