sofia-sip/su_tag.h

Go to the documentation of this file.
00001 /*
00002  * This file is part of the Sofia-SIP package
00003  *
00004  * Copyright (C) 2005 Nokia Corporation.
00005  *
00006  * Contact: Pekka Pessi <pekka.pessi@nokia-email.address.hidden>
00007  *
00008  * This library is free software; you can redistribute it and/or
00009  * modify it under the terms of the GNU Lesser General Public License
00010  * as published by the Free Software Foundation; either version 2.1 of
00011  * the License, or (at your option) any later version.
00012  *
00013  * This library is distributed in the hope that it will be useful, but
00014  * WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
00016  * Lesser General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU Lesser General Public
00019  * License along with this library; if not, write to the Free Software
00020  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
00021  * 02110-1301 USA
00022  *
00023  */
00024 
00025 #ifndef SU_TAG_H
00026 
00027 #define SU_TAG_H
00028 
00037 #ifndef SU_CONFIG_H
00038 #include <sofia-sip/su_config.h>
00039 #endif
00040 
00041 #ifndef SU_TYPES_H
00042 #include <sofia-sip/su_types.h>
00043 #endif
00044 
00045 #ifndef SU_ALLOC_H
00046 #include <sofia-sip/su_alloc.h>
00047 #endif
00048 
00049 #include <stdarg.h>
00050 #include <stddef.h> /* ANSI C: size_t */
00051 
00052 SOFIA_BEGIN_DECLS
00053 
00055 typedef struct tag_type_s const *tag_type_t;
00057 typedef intptr_t                 tag_value_t;
00058 
00060 #define TAG_LIST tag_type_t tag, tag_value_t value, ...
00061 
00063 typedef struct {
00064   tag_type_t   t_tag;           
00065   tag_value_t  t_value;         
00066 } tagi_t;
00067 
00069 typedef struct tag_class_s const tag_class_t;
00070 
00071 struct tag_type_s {
00072   char const    *tt_ns;
00073   char const    *tt_name;
00074   tag_class_t   *tt_class;
00075   tag_value_t    tt_magic;
00076 };
00077 
00079 typedef struct tag_type_s const tag_typedef_t[1];
00080 
00082 SOFIAPUBVAR tag_typedef_t tag_null;
00083 
00085 SOFIAPUBVAR tag_typedef_t tag_skip;
00086 
00088 SOFIAPUBVAR tag_typedef_t tag_next;
00089 
00091 SOFIAPUBVAR tag_typedef_t tag_any;
00092 
00096 SOFIAPUBVAR tag_typedef_t tag_filter;
00097 
00101 typedef int tag_filter_f(tagi_t const *filter, tagi_t const *dest);
00102 
00104 #define TAG_NULL()  (tag_type_t)0, (tag_value_t)0
00105 
00107 #define TAG_END()   (tag_type_t)0, (tag_value_t)0
00108 
00110 #define TAG_SKIP(x)    tag_skip, (tag_value_t)(x)
00111 
00113 #define TAG_NEXT(next) tag_next, (tag_value_t)(next)
00114 
00116 #define TAG_ANY()   tag_any,  (tag_value_t)0
00117 
00120 #define TAG_IF(condition, item) !(condition) ? tag_skip : item
00121 
00125 #define TAG_FILTER(function)  tag_filter, tag_filter_v(function)
00126 
00128 SOFIAPUBFUN int t_snprintf(tagi_t const *t, char b[], size_t size);
00129 
00131 SOFIAPUBFUN int t_scan(tag_type_t tt, su_home_t *home, char const *s, 
00132                        tag_value_t *return_value);
00133 
00134 /* Tagarg functions */
00135 SOFIAPUBFUN tagi_t *tl_tlist(su_home_t *, tag_type_t, tag_value_t, ...);
00136 SOFIAPUBFUN size_t tl_tmove(tagi_t *dst, size_t, tag_type_t, tag_value_t, ...);
00137 SOFIAPUBFUN int tl_gets(tagi_t const lst[], tag_type_t, tag_value_t, ...);
00138 SOFIAPUBFUN int tl_tgets(tagi_t lst[], tag_type_t, tag_value_t, ...);
00139 SOFIAPUBFUN tagi_t *tl_tfilter(su_home_t *, tagi_t const lst[], 
00140                                tag_type_t, tag_value_t, ...);
00141 SOFIAPUBFUN int tl_tremove(tagi_t lst[], tag_type_t, tag_value_t, ...);
00142 
00143 /* Low-level taglist manipulation functions */
00144 SOFIAPUBFUN size_t tl_len(tagi_t const lst[]);
00145 SOFIAPUBFUN size_t tl_xtra(tagi_t const lst[], size_t offset);
00146 SOFIAPUBFUN tagi_t *tl_next(tagi_t const *lst);
00147 SOFIAPUBFUN tagi_t *tl_move(tagi_t *dst, tagi_t const src[]);
00148 SOFIAPUBFUN tagi_t *tl_dup(tagi_t dst[], tagi_t const lst[], void **bb);
00149 SOFIAPUBFUN tagi_t *tl_adup(su_home_t *, tagi_t const lst[]);
00150 SOFIAPUBFUN void tl_free(tagi_t list[]);
00151 
00152 SOFIAPUBFUN tagi_t *tl_find(tagi_t const lst[], tag_type_t tt);
00153 SOFIAPUBFUN tagi_t *tl_find_last(tagi_t const lst[], tag_type_t tt);
00154 SOFIAPUBFUN tagi_t *tl_filter(tagi_t *, tagi_t const filter[],
00155                               tagi_t const lst[], void **b);
00156 SOFIAPUBFUN tagi_t *tl_afilter(su_home_t *, tagi_t const filter[],
00157                                tagi_t const lst[]);
00158 
00159 SOFIAPUBFUN tagi_t *tl_filtered_tlist(su_home_t *home, tagi_t const filter[], 
00160                                       tag_type_t, tag_value_t, ...);
00161 
00162 SOFIAPUBFUN size_t  tl_vlen(va_list ap);
00163 SOFIAPUBFUN tagi_t *tl_list(tag_type_t tag, tag_value_t value, ...);
00164 SOFIAPUBFUN tagi_t *tl_vlist2(tag_type_t tag, tag_value_t value, va_list ap);
00165 SOFIAPUBFUN tagi_t *tl_vlist(va_list ap);
00166 SOFIAPUBFUN tagi_t *tl_llist(tag_type_t tag, tag_value_t value, ...);
00167 SOFIAPUBFUN tagi_t *tl_vllist(tag_type_t tag, tag_value_t value, va_list ap);
00168 SOFIAPUBFUN void    tl_vfree(tagi_t *t);
00169 
00171 #define SU_ALIGN(x) \
00172 ((sizeof(void *) - ((intptr_t)(x) & (sizeof(void *) - 1))) & (sizeof(void *) - 1))
00173 
00174 #if SU_HAVE_INLINE
00175 su_inline tag_value_t tag_int_v(int v) { return (tag_value_t)v; }
00176 su_inline tag_value_t tag_int_vr(int *vp) { return (tag_value_t)vp; }
00177 su_inline tag_value_t tag_uint_v(unsigned v) { return (tag_value_t)v; }
00178 su_inline tag_value_t tag_uint_vr(unsigned *vp) { return (tag_value_t)vp; }
00179 su_inline tag_value_t tag_usize_v(usize_t v) { return (tag_value_t)v; }
00180 su_inline tag_value_t tag_usize_vr(usize_t *vp) { return (tag_value_t)vp; }
00181 su_inline tag_value_t tag_size_v(size_t v) { return (tag_value_t)v; }
00182 su_inline tag_value_t tag_size_vr(size_t *vp) { return (tag_value_t)vp; }
00183 su_inline tag_value_t tag_bool_v(int v) { return v != 0; }
00184 su_inline tag_value_t tag_bool_vr(int *vp) { return (tag_value_t)vp; }
00185 su_inline tag_value_t tag_ptr_v(void *v) { return (tag_value_t)v; }
00186 su_inline tag_value_t tag_ptr_vr(void *vp, void *v)
00187   { (void)v; return(tag_value_t)vp; }
00188 su_inline tag_value_t tag_cptr_v(void const *v) { return (tag_value_t)v; }
00189 su_inline tag_value_t tag_cptr_vr(void *vp, void const *v) 
00190   { (void)v; return(tag_value_t)vp; }
00191 su_inline tag_value_t tag_cstr_v(char const *v) { return (tag_value_t)v; }
00192 su_inline tag_value_t tag_cstr_vr(char const**vp) {return(tag_value_t)vp;}
00193 su_inline tag_value_t tag_str_v(char const *v) { return (tag_value_t)v; }
00194 su_inline tag_value_t tag_str_vr(char const **vp) {return(tag_value_t)vp;}
00195 #if __cplusplus
00196 extern "C++" {
00197   su_inline tag_value_t tag_ptr_v(void const *v)
00198   { return (tag_value_t)v; }
00199   su_inline tag_value_t tag_ptr_vr(void *vp, void const *p) 
00200   { return (tag_value_t)vp; }
00201   su_inline tag_value_t tag_str_v(char *v) { return (tag_value_t)v; }
00202   su_inline tag_value_t tag_str_vr(char **vp) {return (tag_value_t)vp;}
00203 }
00204 #endif
00205 su_inline tag_value_t tag_filter_v(tag_filter_f *v) {return(tag_value_t)v;}
00206 #else
00207 #define tag_int_v(v)   (tag_value_t)(v)
00208 #define tag_int_vr(v)  (tag_value_t)(v)
00209 #define tag_uint_v(v)  (tag_value_t)(v)
00210 #define tag_uint_vr(v) (tag_value_t)(v)
00211 #define tag_usize_v(v) (tag_value_t)(v)
00212 #define tag_usize_vr(v) (tag_value_t)(v)
00213 #define tag_bool_v(v)  (tag_value_t)(v != 0)
00214 #define tag_bool_vr(v) (tag_value_t)(v)
00215 #define tag_ptr_v(v)   (tag_value_t)(v)
00216 #define tag_ptr_vr(v,x) (tag_value_t)(v)
00217 #define tag_cptr_v(v)   (tag_value_t)(v)
00218 #define tag_cptr_vr(v,x) (tag_value_t)(v)
00219 #define tag_cstr_v(v)  (tag_value_t)(v)
00220 #define tag_cstr_vr(v) (tag_value_t)(v)
00221 #define tag_str_v(v)   (tag_value_t)(v)
00222 #define tag_str_vr(v)  (tag_value_t)(v)
00223 #define tag_filter_v(v) (tag_value_t)(v)
00224 #endif
00225 
00226 SOFIA_END_DECLS
00227 
00228 #endif 

Sofia-SIP 1.12.6 - Copyright (C) 2006 Nokia Corporation. All rights reserved. Licensed under the terms of the GNU Lesser General Public License.