5#ifndef SPA_POD_PARSER_H 
    6#define SPA_POD_PARSER_H 
   36#define SPA_POD_PARSER_INIT(buffer,size)  ((struct spa_pod_parser){ (buffer), (size), 0, {} }) 
   39                                       const void *data, uint32_t size)
 
 
   53        *state = parser->
state;
 
 
   59        parser->
state = *state;
 
 
   93        parser->state.frame = frame;
 
 
  329#define SPA_POD_PARSER_COLLECT(pod,_type,args)                                          \ 
  333                *va_arg(args, bool*) = SPA_POD_VALUE(struct spa_pod_bool, pod);         \ 
 
  337                *va_arg(args, int32_t*) = SPA_POD_VALUE(struct spa_pod_int, pod);       \ 
  340                *va_arg(args, int64_t*) = SPA_POD_VALUE(struct spa_pod_long, pod);      \ 
  343                *va_arg(args, float*) = SPA_POD_VALUE(struct spa_pod_float, pod);       \ 
  346                *va_arg(args, double*) = SPA_POD_VALUE(struct spa_pod_double, pod);     \ 
  349                *va_arg(args, char**) =                                                 \ 
  350                        ((pod) == NULL || (SPA_POD_TYPE(pod) == SPA_TYPE_None)          \ 
  352                                : (char *)SPA_POD_CONTENTS(struct spa_pod_string, pod));        \ 
  356                char *dest = va_arg(args, char*);                                       \ 
  357                uint32_t maxlen = va_arg(args, uint32_t);                               \ 
  358                strncpy(dest, (char *)SPA_POD_CONTENTS(struct spa_pod_string, pod), maxlen-1);  \ 
  359                dest[maxlen-1] = '\0';                                                  \ 
  363                *(va_arg(args, void **)) = SPA_POD_CONTENTS(struct spa_pod_bytes, pod); \ 
  364                *(va_arg(args, uint32_t *)) = SPA_POD_BODY_SIZE(pod);                   \ 
  367                *va_arg(args, struct spa_rectangle*) =                                  \ 
  368                                SPA_POD_VALUE(struct spa_pod_rectangle, pod);           \ 
  371                *va_arg(args, struct spa_fraction*) =                                   \ 
  372                                SPA_POD_VALUE(struct spa_pod_fraction, pod);            \ 
  375                *va_arg(args, uint32_t **) =                                            \ 
  376                        (uint32_t *) SPA_POD_CONTENTS(struct spa_pod_bitmap, pod);      \ 
  379                *va_arg(args, uint32_t*) = SPA_POD_ARRAY_VALUE_SIZE(pod);               \ 
  380                *va_arg(args, uint32_t*) = SPA_POD_ARRAY_VALUE_TYPE(pod);               \ 
  381                *va_arg(args, uint32_t*) = SPA_POD_ARRAY_N_VALUES(pod);                 \ 
  382                *va_arg(args, void**) = SPA_POD_ARRAY_VALUES(pod);                      \ 
  386                struct spa_pod_pointer_body *b =                                        \ 
  387                                (struct spa_pod_pointer_body *) SPA_POD_BODY(pod);      \ 
  388                *(va_arg(args, uint32_t *)) = b->type;                                  \ 
  389                *(va_arg(args, const void **)) = b->value;                              \ 
  393                *va_arg(args, int64_t*) = SPA_POD_VALUE(struct spa_pod_fd, pod);        \ 
  400                const struct spa_pod **d = va_arg(args, const struct spa_pod**);        \ 
  402                        *d = ((pod) == NULL || (SPA_POD_TYPE(pod) == SPA_TYPE_None)     \ 
  411#define SPA_POD_PARSER_SKIP(_type,args)                                                 \ 
  415                va_arg(args, char*);                                                    \ 
 
  416                va_arg(args, uint32_t);                                                 \ 
  419                va_arg(args, void*);                                                    \ 
  420                va_arg(args, void*);                                                    \ 
  424                va_arg(args, void*);                                                    \ 
  441                va_arg(args, void*);                                                    \ 
 
  470                if ((format = va_arg(args, 
char *)) == NULL)
 
  476                if ((optional = (*format == 
'?')))
 
 
  504        va_start(args, parser);
 
  511#define SPA_POD_OPT_Bool(val)                           "?" SPA_POD_Bool(val) 
  512#define SPA_POD_OPT_Id(val)                             "?" SPA_POD_Id(val) 
  513#define SPA_POD_OPT_Int(val)                            "?" SPA_POD_Int(val) 
  514#define SPA_POD_OPT_Long(val)                           "?" SPA_POD_Long(val) 
  515#define SPA_POD_OPT_Float(val)                          "?" SPA_POD_Float(val) 
 
  516#define SPA_POD_OPT_Double(val)                         "?" SPA_POD_Double(val) 
  517#define SPA_POD_OPT_String(val)                         "?" SPA_POD_String(val) 
  518#define SPA_POD_OPT_Stringn(val,len)                    "?" SPA_POD_Stringn(val,len) 
  519#define SPA_POD_OPT_Bytes(val,len)                      "?" SPA_POD_Bytes(val,len) 
  520#define SPA_POD_OPT_Rectangle(val)                      "?" SPA_POD_Rectangle(val) 
  521#define SPA_POD_OPT_Fraction(val)                       "?" SPA_POD_Fraction(val) 
  522#define SPA_POD_OPT_Array(csize,ctype,n_vals,vals)      "?" SPA_POD_Array(csize,ctype,n_vals,vals) 
  523#define SPA_POD_OPT_Pointer(type,val)                   "?" SPA_POD_Pointer(type,val) 
  524#define SPA_POD_OPT_Fd(val)                             "?" SPA_POD_Fd(val) 
  525#define SPA_POD_OPT_Pod(val)                            "?" SPA_POD_Pod(val) 
  526#define SPA_POD_OPT_PodObject(val)                      "?" SPA_POD_PodObject(val) 
  527#define SPA_POD_OPT_PodStruct(val)                      "?" SPA_POD_PodStruct(val) 
  528#define SPA_POD_OPT_PodChoice(val)                      "?" SPA_POD_PodChoice(val) 
  530#define spa_pod_parser_get_object(p,type,id,...)                                \ 
  532        struct spa_pod_frame _f;                                                \ 
  534        if ((_res = spa_pod_parser_push_object(p, &_f, type, id)) == 0) {       \ 
  535                _res = spa_pod_parser_get(p,##__VA_ARGS__, 0);                  \ 
  536                spa_pod_parser_pop(p, &_f);                                     \ 
  541#define spa_pod_parser_get_struct(p,...)                                \ 
  543        struct spa_pod_frame _f;                                        \ 
  545        if ((_res = spa_pod_parser_push_struct(p, &_f)) == 0) {         \ 
  546                _res = spa_pod_parser_get(p,##__VA_ARGS__, NULL);       \ 
  547                spa_pod_parser_pop(p, &_f);                             \ 
  552#define spa_pod_parse_object(pod,type,id,...)                   \ 
  554        struct spa_pod_parser _p;                               \ 
  555        spa_pod_parser_pod(&_p, pod);                           \ 
  556        spa_pod_parser_get_object(&_p,type,id,##__VA_ARGS__);   \ 
  559#define spa_pod_parse_struct(pod,...)                           \ 
  561        struct spa_pod_parser _p;                               \ 
  562        spa_pod_parser_pod(&_p, pod);                           \ 
  563        spa_pod_parser_get_struct(&_p,##__VA_ARGS__);           \ 
 
static int spa_pod_is_bitmap(const struct spa_pod *pod)
Definition iter.h:316
static void spa_pod_parser_pod(struct spa_pod_parser *parser, const struct spa_pod *pod)
Definition parser.h:50
static int spa_pod_get_int(const struct spa_pod *pod, int32_t *value)
Definition iter.h:173
static int spa_pod_parser_get_double(struct spa_pod_parser *parser, double *value)
Definition parser.h:175
static int spa_pod_is_long(const struct spa_pod *pod)
Definition iter.h:181
static int spa_pod_is_bytes(const struct spa_pod *pod)
Definition iter.h:246
static int spa_pod_parser_get_float(struct spa_pod_parser *parser, float *value)
Definition parser.h:166
static const struct spa_pod_prop * spa_pod_object_find_prop(const struct spa_pod_object *pod, const struct spa_pod_prop *start, uint32_t key)
Definition iter.h:394
static int spa_pod_get_pointer(const struct spa_pod *pod, uint32_t *type, const void **value)
Definition iter.h:266
static int spa_pod_parser_get_bytes(struct spa_pod_parser *parser, const void **value, uint32_t *len)
Definition parser.h:193
static int spa_pod_get_fraction(const struct spa_pod *pod, struct spa_fraction *value)
Definition iter.h:309
static int spa_pod_parser_get(struct spa_pod_parser *parser,...)
Definition parser.h:505
static struct spa_pod * spa_pod_parser_current(struct spa_pod_parser *parser)
Definition parser.h:102
static int spa_pod_is_rectangle(const struct spa_pod *pod)
Definition iter.h:289
static int spa_pod_is_fd(const struct spa_pod *pod)
Definition iter.h:275
static int spa_pod_is_pointer(const struct spa_pod *pod)
Definition iter.h:260
#define SPA_POD_TYPE(pod)
Definition pod.h:28
static int spa_pod_get_id(const struct spa_pod *pod, uint32_t *value)
Definition iter.h:160
static int spa_pod_parser_get_long(struct spa_pod_parser *parser, int64_t *value)
Definition parser.h:157
#define SPA_POD_BODY_SIZE(pod)
Definition pod.h:26
static int spa_pod_get_float(const struct spa_pod *pod, float *value)
Definition iter.h:199
static int spa_pod_parser_get_int(struct spa_pod_parser *parser, int32_t *value)
Definition parser.h:148
static int spa_pod_parser_get_pod(struct spa_pod_parser *parser, struct spa_pod **value)
Definition parser.h:238
static int spa_pod_parser_push_struct(struct spa_pod_parser *parser, struct spa_pod_frame *frame)
Definition parser.h:247
static void spa_pod_parser_get_state(struct spa_pod_parser *parser, struct spa_pod_parser_state *state)
Definition parser.h:57
#define SPA_POD_PARSER_COLLECT(pod, _type, args)
Definition parser.h:335
static struct spa_pod * spa_pod_parser_deref(struct spa_pod_parser *parser, uint32_t offset, uint32_t size)
Definition parser.h:69
static int spa_pod_parser_get_string(struct spa_pod_parser *parser, const char **value)
Definition parser.h:184
static int spa_pod_parser_get_rectangle(struct spa_pod_parser *parser, struct spa_rectangle *value)
Definition parser.h:220
static int spa_pod_parser_push_object(struct spa_pod_parser *parser, struct spa_pod_frame *frame, uint32_t type, uint32_t *id)
Definition parser.h:260
static int spa_pod_is_object(const struct spa_pod *pod)
Definition iter.h:372
static int spa_pod_get_rectangle(const struct spa_pod *pod, struct spa_rectangle *value)
Definition iter.h:295
static int spa_pod_get_fd(const struct spa_pod *pod, int64_t *value)
Definition iter.h:281
static int spa_pod_is_struct(const struct spa_pod *pod)
Definition iter.h:367
#define SPA_POD_PARSER_SKIP(_type, args)
Definition parser.h:417
static struct spa_pod * spa_pod_parser_next(struct spa_pod_parser *parser)
Definition parser.h:114
static int spa_pod_get_long(const struct spa_pod *pod, int64_t *value)
Definition iter.h:186
static void spa_pod_parser_advance(struct spa_pod_parser *parser, const struct spa_pod *pod)
Definition parser.h:109
static void spa_pod_parser_push(struct spa_pod_parser *parser, struct spa_pod_frame *frame, const struct spa_pod *pod, uint32_t offset)
Definition parser.h:92
static int spa_pod_is_string(const struct spa_pod *pod)
Definition iter.h:220
static void spa_pod_parser_init(struct spa_pod_parser *parser, const void *data, uint32_t size)
Definition parser.h:44
static int spa_pod_parser_get_bool(struct spa_pod_parser *parser, bool *value)
Definition parser.h:130
static int spa_pod_is_choice(const struct spa_pod *pod)
Definition iter.h:347
static int spa_pod_get_string(const struct spa_pod *pod, const char **value)
Definition iter.h:228
static int spa_pod_get_double(const struct spa_pod *pod, double *value)
Definition iter.h:212
static int spa_pod_parser_get_fd(struct spa_pod_parser *parser, int64_t *value)
Definition parser.h:211
#define SPA_POD_PARSER_INIT(buffer, size)
Definition parser.h:42
static int spa_pod_get_bool(const struct spa_pod *pod, bool *value)
Definition iter.h:147
static int spa_pod_parser_get_pointer(struct spa_pod_parser *parser, uint32_t *type, const void **value)
Definition parser.h:202
static struct spa_pod * spa_pod_parser_frame(struct spa_pod_parser *parser, struct spa_pod_frame *frame)
Definition parser.h:87
#define SPA_POD_OBJECT_TYPE(obj)
Definition pod.h:173
#define SPA_POD_OBJECT_ID(obj)
Definition pod.h:175
static int spa_pod_parser_getv(struct spa_pod_parser *parser, va_list args)
Definition parser.h:452
static int spa_pod_is_array(const struct spa_pod *pod)
Definition iter.h:322
static int spa_pod_parser_get_id(struct spa_pod_parser *parser, uint32_t *value)
Definition parser.h:139
static int spa_pod_is_id(const struct spa_pod *pod)
Definition iter.h:155
static int spa_pod_is_double(const struct spa_pod *pod)
Definition iter.h:207
static int spa_pod_is_int(const struct spa_pod *pod)
Definition iter.h:168
static void spa_pod_parser_reset(struct spa_pod_parser *parser, struct spa_pod_parser_state *state)
Definition parser.h:63
static bool spa_pod_parser_can_collect(const struct spa_pod *pod, char type)
Definition parser.h:277
static int spa_pod_is_none(const struct spa_pod *pod)
Definition iter.h:137
static int spa_pod_is_fraction(const struct spa_pod *pod)
Definition iter.h:303
#define SPA_POD_SIZE(pod)
Definition pod.h:30
static int spa_pod_parser_get_fraction(struct spa_pod_parser *parser, struct spa_fraction *value)
Definition parser.h:229
static int spa_pod_parser_pop(struct spa_pod_parser *parser, struct spa_pod_frame *frame)
Definition parser.h:122
static int spa_pod_is_float(const struct spa_pod *pod)
Definition iter.h:194
#define SPA_POD_CHOICE_CHILD(choice)
Definition pod.h:132
#define SPA_POD_CHOICE_TYPE(choice)
Definition pod.h:134
static int spa_pod_get_bytes(const struct spa_pod *pod, const void **value, uint32_t *len)
Definition iter.h:251
static int spa_pod_is_bool(const struct spa_pod *pod)
Definition iter.h:142
@ SPA_CHOICE_None
no choice, first value is current
Definition pod.h:147
@ SPA_TYPE_Object
Definition type.h:45
@ SPA_TYPE_Choice
Definition type.h:49
@ SPA_TYPE_Struct
Definition type.h:44
#define SPA_ROUND_UP_N(num, align)
Definition defs.h:342
#define SPA_IS_ALIGNED(p, align)
Definition defs.h:355
#define SPA_PTROFF(ptr_, offset_, type_)
Return the address (buffer + offset) as pointer of type.
Definition defs.h:222
struct spa_pod pod
Definition iter.h:28
uint32_t offset
Definition iter.h:30
struct spa_pod_frame * parent
Definition iter.h:29
uint32_t flags
Definition iter.h:31
struct spa_pod pod
Definition pod.h:184
uint32_t offset
Definition parser.h:29
uint32_t flags
Definition parser.h:30
struct spa_pod_frame * frame
Definition parser.h:31
uint32_t size
Definition parser.h:36
struct spa_pod_parser_state state
Definition parser.h:38
const void * data
Definition parser.h:35
uint32_t _padding
Definition parser.h:37
struct spa_pod value
Definition pod.h:226
uint32_t type
Definition pod.h:45
uint32_t size
Definition pod.h:44