su
1.12.11devel
Main Page
Related Pages
Modules
Data Structures
Files
File List
Globals
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerator
Macros
Groups
Pages
libsofia-sip-ua
su
sofia-sip
su_tag.h
Go to the documentation of this file.
1
/*
2
* This file is part of the Sofia-SIP package
3
*
4
* Copyright (C) 2005 Nokia Corporation.
5
*
6
* Contact: Pekka Pessi <pekka.pessi@nokia-email.address.hidden>
7
*
8
* This library is free software; you can redistribute it and/or
9
* modify it under the terms of the GNU Lesser General Public License
10
* as published by the Free Software Foundation; either version 2.1 of
11
* the License, or (at your option) any later version.
12
*
13
* This library is distributed in the hope that it will be useful, but
14
* WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
* Lesser General Public License for more details.
17
*
18
* You should have received a copy of the GNU Lesser General Public
19
* License along with this library; if not, write to the Free Software
20
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
21
* 02110-1301 USA
22
*
23
*/
24
25
#ifndef SU_TAG_H
26
27
#define SU_TAG_H
28
37
#ifndef SU_CONFIG_H
38
#include <
sofia-sip/su_config.h
>
39
#endif
40
41
#ifndef SU_TYPES_H
42
#include <
sofia-sip/su_types.h
>
43
#endif
44
45
#ifndef SU_ALLOC_H
46
#include <
sofia-sip/su_alloc.h
>
47
#endif
48
49
#include <stdarg.h>
50
#include <stddef.h>
/* ANSI C: size_t */
51
52
SOFIA_BEGIN_DECLS
53
55
typedef
struct
tag_type_s
const *
tag_type_t
;
57
typedef
intptr_t
tag_value_t
;
58
60
#define TAG_LIST tag_type_t tag, tag_value_t value, ...
61
63
typedef
struct
{
64
tag_type_t
t_tag
;
65
tag_value_t
t_value
;
66
}
tagi_t
;
67
69
typedef
struct
tag_class_s
const
tag_class_t
;
70
76
struct
tag_type_s
{
77
char
const
*
tt_ns
;
78
char
const
*
tt_name
;
79
tag_class_t
*
tt_class
;
80
tag_value_t
tt_magic
;
82
};
83
85
typedef
struct
tag_type_s
const
tag_typedef_t
[1];
86
88
SOFIAPUBVAR
tag_typedef_t
tag_null
;
89
91
SOFIAPUBVAR
tag_typedef_t
tag_skip
;
92
94
SOFIAPUBVAR
tag_typedef_t
tag_next
;
95
97
SOFIAPUBVAR
tag_typedef_t
tag_any
;
98
102
SOFIAPUBVAR
tag_typedef_t
tag_filter
;
103
107
typedef
int
tag_filter_f
(
tagi_t
const
*filter,
tagi_t
const
*dest);
108
110
#define TAG_NULL() (tag_type_t)0, (tag_value_t)0
111
113
#define TAG_END() (tag_type_t)0, (tag_value_t)0
114
116
#define TAG_SKIP(x) tag_skip, (tag_value_t)(x)
117
119
#define TAG_NEXT(next) tag_next, (tag_value_t)(next)
120
122
#define TAG_ANY() tag_any, (tag_value_t)0
123
126
#define TAG_IF(condition, item) !(condition) ? tag_skip : item
127
131
#define TAG_FILTER(function) tag_filter, tag_filter_v(function)
132
134
SOFIAPUBFUN
int
t_snprintf
(
tagi_t
const
*t,
char
b[],
size_t
size);
135
137
SOFIAPUBFUN
int
t_scan
(tag_type_t tt,
su_home_t
*home,
char
const
*s,
138
tag_value_t
*return_value);
139
140
/* Tagarg functions */
141
SOFIAPUBFUN
tagi_t
*
tl_tlist
(
su_home_t
*, tag_type_t,
tag_value_t
, ...);
142
SOFIAPUBFUN
size_t
tl_tmove
(
tagi_t
*dst,
size_t
, tag_type_t,
tag_value_t
, ...);
143
SOFIAPUBFUN
int
tl_gets
(
tagi_t
const
lst[], tag_type_t,
tag_value_t
, ...);
144
SOFIAPUBFUN
int
tl_tgets
(
tagi_t
lst[], tag_type_t,
tag_value_t
, ...);
145
SOFIAPUBFUN
tagi_t
*
tl_tfilter
(
su_home_t
*,
tagi_t
const
lst[],
146
tag_type_t,
tag_value_t
, ...);
147
SOFIAPUBFUN
int
tl_tremove
(
tagi_t
lst[], tag_type_t,
tag_value_t
, ...);
148
149
/* Low-level taglist manipulation functions */
150
SOFIAPUBFUN
size_t
tl_len
(
tagi_t
const
lst[]);
151
SOFIAPUBFUN
size_t
tl_vllen
(tag_type_t tag,
tag_value_t
value, va_list ap);
152
SOFIAPUBFUN
size_t
tl_xtra
(
tagi_t
const
lst[],
size_t
offset);
153
SOFIAPUBFUN
tagi_t
*
tl_next
(
tagi_t
const
*lst);
154
SOFIAPUBFUN
tagi_t
*
tl_move
(
tagi_t
*dst,
tagi_t
const
src[]);
155
SOFIAPUBFUN
tagi_t
*
tl_dup
(
tagi_t
dst[],
tagi_t
const
lst[],
void
**bb);
156
SOFIAPUBFUN
tagi_t
*
tl_adup
(
su_home_t
*,
tagi_t
const
lst[]);
157
SOFIAPUBFUN
void
tl_free
(
tagi_t
list[]);
158
159
SOFIAPUBFUN
tagi_t
*
tl_find
(
tagi_t
const
lst[], tag_type_t tt);
160
SOFIAPUBFUN
tagi_t
*
tl_find_last
(
tagi_t
const
lst[], tag_type_t tt);
161
SOFIAPUBFUN
tagi_t
*tl_filter(
tagi_t
*,
tagi_t
const
filter[],
162
tagi_t
const
lst[],
void
**b);
163
SOFIAPUBFUN
tagi_t
*
tl_afilter
(
su_home_t
*,
tagi_t
const
filter[],
164
tagi_t
const
lst[]);
165
166
SOFIAPUBFUN
tagi_t
*
tl_filtered_tlist
(
su_home_t
*home,
tagi_t
const
filter[],
167
tag_type_t,
tag_value_t
, ...);
168
169
SOFIAPUBFUN
size_t
tl_vlen
(va_list ap);
170
SOFIAPUBFUN
tagi_t
*
tl_list
(tag_type_t tag,
tag_value_t
value, ...);
171
SOFIAPUBFUN
tagi_t
*tl_vlist2(tag_type_t tag,
tag_value_t
value, va_list ap);
172
SOFIAPUBFUN
tagi_t
*
tl_vlist
(va_list ap);
173
SOFIAPUBFUN
tagi_t
*
tl_llist
(tag_type_t tag,
tag_value_t
value, ...);
174
SOFIAPUBFUN
tagi_t
*
tl_vllist
(tag_type_t tag,
tag_value_t
value, va_list ap);
175
SOFIAPUBFUN
void
tl_vfree
(
tagi_t
*t);
176
178
#define SU_ALIGN(x) \
179
((sizeof(void *) - ((intptr_t)(x) & (sizeof(void *) - 1))) & (sizeof(void *) - 1))
180
181
#if SU_INLINE_TAG_CAST
182
su_inline
tag_value_t
tag_int_v(
int
v) {
return
(
tag_value_t
)v; }
183
su_inline
tag_value_t
tag_int_vr(
int
*vp) {
return
(
tag_value_t
)vp; }
184
su_inline
tag_value_t
tag_uint_v(
unsigned
v) {
return
(
tag_value_t
)v; }
185
su_inline
tag_value_t
tag_uint_vr(
unsigned
*vp) {
return
(
tag_value_t
)vp; }
186
su_inline
tag_value_t
tag_usize_v(usize_t v) {
return
(
tag_value_t
)v; }
187
su_inline
tag_value_t
tag_usize_vr(usize_t *vp) {
return
(
tag_value_t
)vp; }
188
su_inline
tag_value_t
tag_size_v(
size_t
v) {
return
(
tag_value_t
)v; }
189
su_inline
tag_value_t
tag_size_vr(
size_t
*vp) {
return
(
tag_value_t
)vp; }
190
su_inline
tag_value_t
tag_bool_v(
int
v) {
return
v != 0; }
191
su_inline
tag_value_t
tag_bool_vr(
int
*vp) {
return
(
tag_value_t
)vp; }
192
su_inline
tag_value_t
tag_ptr_v(
void
*v) {
return
(
tag_value_t
)v; }
193
su_inline
tag_value_t
tag_ptr_vr(
void
*vp,
void
*v)
194
{ (void)v;
return
(
tag_value_t
)vp; }
195
su_inline
tag_value_t
tag_cptr_v(
void
const
*v) {
return
(
tag_value_t
)v; }
196
su_inline
tag_value_t
tag_cptr_vr(
void
*vp,
void
const
*v)
197
{ (void)v;
return
(
tag_value_t
)vp; }
198
su_inline
tag_value_t
tag_cstr_v(
char
const
*v) {
return
(
tag_value_t
)v; }
199
su_inline
tag_value_t
tag_cstr_vr(
char
const
**vp) {
return
(
tag_value_t
)vp;}
200
su_inline
tag_value_t
tag_str_v(
char
const
*v) {
return
(
tag_value_t
)v; }
201
su_inline
tag_value_t
tag_str_vr(
char
const
**vp) {
return
(
tag_value_t
)vp;}
202
#if __cplusplus
203
extern
"C++"
{
204
su_inline
tag_value_t
tag_ptr_v(
void
const
*v)
205
{
return
(
tag_value_t
)v; }
206
su_inline
tag_value_t
tag_ptr_vr(
void
*vp,
void
const
*p)
207
{ (void)p;
return
(
tag_value_t
)vp; }
208
su_inline
tag_value_t
tag_str_v(
char
*v) {
return
(
tag_value_t
)v; }
209
su_inline
tag_value_t
tag_str_vr(
char
**vp) {
return
(
tag_value_t
)vp;}
210
}
211
#endif
212
su_inline
tag_value_t
tag_filter_v(
tag_filter_f
*v) {
return
(
tag_value_t
)v;}
213
#else
214
#define tag_int_v(v) (tag_value_t)(v)
215
#define tag_int_vr(v) (tag_value_t)(v)
216
#define tag_uint_v(v) (tag_value_t)(v)
217
#define tag_uint_vr(v) (tag_value_t)(v)
218
#define tag_usize_v(v) (tag_value_t)(v)
219
#define tag_usize_vr(v) (tag_value_t)(v)
220
#define tag_size_v(v) (tag_value_t)(v)
221
#define tag_size_vr(v) (tag_value_t)(v)
222
#define tag_bool_v(v) (tag_value_t)(v != 0)
223
#define tag_bool_vr(v) (tag_value_t)(v)
224
#define tag_ptr_v(v) (tag_value_t)(v)
225
#define tag_ptr_vr(v,x) (tag_value_t)(v)
226
#define tag_cptr_v(v) (tag_value_t)(v)
227
#define tag_cptr_vr(v,x) (tag_value_t)(v)
228
#define tag_cstr_v(v) (tag_value_t)(v)
229
#define tag_cstr_vr(v) (tag_value_t)(v)
230
#define tag_str_v(v) (tag_value_t)(v)
231
#define tag_str_vr(v) (tag_value_t)(v)
232
#define tag_filter_v(v) (tag_value_t)(v)
233
#endif
234
235
SOFIA_END_DECLS
236
237
#endif
Sofia-SIP 1.12.11devel - Copyright (C) 2006 Nokia Corporation. All rights reserved. Licensed under the terms of the GNU Lesser General Public License.