su  1.12.11devel
 All Data Structures Files Functions Variables Typedefs Enumerator Macros Groups Pages
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;
58 
60 #define TAG_LIST tag_type_t tag, tag_value_t value, ...
61 
63 typedef struct {
64  tag_type_t t_tag;
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;
82 };
83 
85 typedef struct tag_type_s const tag_typedef_t[1];
86 
89 
92 
95 
98 
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, ...);
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.