su 1.12.10
|
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 00076 struct tag_type_s { 00077 char const *tt_ns; 00078 char const *tt_name; 00079 tag_class_t *tt_class; 00080 tag_value_t tt_magic; 00082 }; 00083 00085 typedef struct tag_type_s const tag_typedef_t[1]; 00086 00088 SOFIAPUBVAR tag_typedef_t tag_null; 00089 00091 SOFIAPUBVAR tag_typedef_t tag_skip; 00092 00094 SOFIAPUBVAR tag_typedef_t tag_next; 00095 00097 SOFIAPUBVAR tag_typedef_t tag_any; 00098 00102 SOFIAPUBVAR tag_typedef_t tag_filter; 00103 00107 typedef int tag_filter_f(tagi_t const *filter, tagi_t const *dest); 00108 00110 #define TAG_NULL() (tag_type_t)0, (tag_value_t)0 00111 00113 #define TAG_END() (tag_type_t)0, (tag_value_t)0 00114 00116 #define TAG_SKIP(x) tag_skip, (tag_value_t)(x) 00117 00119 #define TAG_NEXT(next) tag_next, (tag_value_t)(next) 00120 00122 #define TAG_ANY() tag_any, (tag_value_t)0 00123 00126 #define TAG_IF(condition, item) !(condition) ? tag_skip : item 00127 00131 #define TAG_FILTER(function) tag_filter, tag_filter_v(function) 00132 00134 SOFIAPUBFUN int t_snprintf(tagi_t const *t, char b[], size_t size); 00135 00137 SOFIAPUBFUN int t_scan(tag_type_t tt, su_home_t *home, char const *s, 00138 tag_value_t *return_value); 00139 00140 /* Tagarg functions */ 00141 SOFIAPUBFUN tagi_t *tl_tlist(su_home_t *, tag_type_t, tag_value_t, ...); 00142 SOFIAPUBFUN size_t tl_tmove(tagi_t *dst, size_t, tag_type_t, tag_value_t, ...); 00143 SOFIAPUBFUN int tl_gets(tagi_t const lst[], tag_type_t, tag_value_t, ...); 00144 SOFIAPUBFUN int tl_tgets(tagi_t lst[], tag_type_t, tag_value_t, ...); 00145 SOFIAPUBFUN tagi_t *tl_tfilter(su_home_t *, tagi_t const lst[], 00146 tag_type_t, tag_value_t, ...); 00147 SOFIAPUBFUN int tl_tremove(tagi_t lst[], tag_type_t, tag_value_t, ...); 00148 00149 /* Low-level taglist manipulation functions */ 00150 SOFIAPUBFUN size_t tl_len(tagi_t const lst[]); 00151 SOFIAPUBFUN size_t tl_xtra(tagi_t const lst[], size_t offset); 00152 SOFIAPUBFUN tagi_t *tl_next(tagi_t const *lst); 00153 SOFIAPUBFUN tagi_t *tl_move(tagi_t *dst, tagi_t const src[]); 00154 SOFIAPUBFUN tagi_t *tl_dup(tagi_t dst[], tagi_t const lst[], void **bb); 00155 SOFIAPUBFUN tagi_t *tl_adup(su_home_t *, tagi_t const lst[]); 00156 SOFIAPUBFUN void tl_free(tagi_t list[]); 00157 00158 SOFIAPUBFUN tagi_t *tl_find(tagi_t const lst[], tag_type_t tt); 00159 SOFIAPUBFUN tagi_t *tl_find_last(tagi_t const lst[], tag_type_t tt); 00160 SOFIAPUBFUN tagi_t *tl_filter(tagi_t *, tagi_t const filter[], 00161 tagi_t const lst[], void **b); 00162 SOFIAPUBFUN tagi_t *tl_afilter(su_home_t *, tagi_t const filter[], 00163 tagi_t const lst[]); 00164 00165 SOFIAPUBFUN tagi_t *tl_filtered_tlist(su_home_t *home, tagi_t const filter[], 00166 tag_type_t, tag_value_t, ...); 00167 00168 SOFIAPUBFUN size_t tl_vlen(va_list ap); 00169 SOFIAPUBFUN tagi_t *tl_list(tag_type_t tag, tag_value_t value, ...); 00170 SOFIAPUBFUN tagi_t *tl_vlist2(tag_type_t tag, tag_value_t value, va_list ap); 00171 SOFIAPUBFUN tagi_t *tl_vlist(va_list ap); 00172 SOFIAPUBFUN tagi_t *tl_llist(tag_type_t tag, tag_value_t value, ...); 00173 SOFIAPUBFUN tagi_t *tl_vllist(tag_type_t tag, tag_value_t value, va_list ap); 00174 SOFIAPUBFUN void tl_vfree(tagi_t *t); 00175 00177 #define SU_ALIGN(x) \ 00178 ((sizeof(void *) - ((intptr_t)(x) & (sizeof(void *) - 1))) & (sizeof(void *) - 1)) 00179 00180 #if SU_INLINE_TAG_CAST 00181 su_inline tag_value_t tag_int_v(int v) { return (tag_value_t)v; } 00182 su_inline tag_value_t tag_int_vr(int *vp) { return (tag_value_t)vp; } 00183 su_inline tag_value_t tag_uint_v(unsigned v) { return (tag_value_t)v; } 00184 su_inline tag_value_t tag_uint_vr(unsigned *vp) { return (tag_value_t)vp; } 00185 su_inline tag_value_t tag_usize_v(usize_t v) { return (tag_value_t)v; } 00186 su_inline tag_value_t tag_usize_vr(usize_t *vp) { return (tag_value_t)vp; } 00187 su_inline tag_value_t tag_size_v(size_t v) { return (tag_value_t)v; } 00188 su_inline tag_value_t tag_size_vr(size_t *vp) { return (tag_value_t)vp; } 00189 su_inline tag_value_t tag_bool_v(int v) { return v != 0; } 00190 su_inline tag_value_t tag_bool_vr(int *vp) { return (tag_value_t)vp; } 00191 su_inline tag_value_t tag_ptr_v(void *v) { return (tag_value_t)v; } 00192 su_inline tag_value_t tag_ptr_vr(void *vp, void *v) 00193 { (void)v; return(tag_value_t)vp; } 00194 su_inline tag_value_t tag_cptr_v(void const *v) { return (tag_value_t)v; } 00195 su_inline tag_value_t tag_cptr_vr(void *vp, void const *v) 00196 { (void)v; return(tag_value_t)vp; } 00197 su_inline tag_value_t tag_cstr_v(char const *v) { return (tag_value_t)v; } 00198 su_inline tag_value_t tag_cstr_vr(char const**vp) {return(tag_value_t)vp;} 00199 su_inline tag_value_t tag_str_v(char const *v) { return (tag_value_t)v; } 00200 su_inline tag_value_t tag_str_vr(char const **vp) {return(tag_value_t)vp;} 00201 #if __cplusplus 00202 extern "C++" { 00203 su_inline tag_value_t tag_ptr_v(void const *v) 00204 { return (tag_value_t)v; } 00205 su_inline tag_value_t tag_ptr_vr(void *vp, void const *p) 00206 { return (tag_value_t)vp; } 00207 su_inline tag_value_t tag_str_v(char *v) { return (tag_value_t)v; } 00208 su_inline tag_value_t tag_str_vr(char **vp) {return (tag_value_t)vp;} 00209 } 00210 #endif 00211 su_inline tag_value_t tag_filter_v(tag_filter_f *v) {return(tag_value_t)v;} 00212 #else 00213 #define tag_int_v(v) (tag_value_t)(v) 00214 #define tag_int_vr(v) (tag_value_t)(v) 00215 #define tag_uint_v(v) (tag_value_t)(v) 00216 #define tag_uint_vr(v) (tag_value_t)(v) 00217 #define tag_usize_v(v) (tag_value_t)(v) 00218 #define tag_usize_vr(v) (tag_value_t)(v) 00219 #define tag_size_v(v) (tag_value_t)(v) 00220 #define tag_size_vr(v) (tag_value_t)(v) 00221 #define tag_bool_v(v) (tag_value_t)(v != 0) 00222 #define tag_bool_vr(v) (tag_value_t)(v) 00223 #define tag_ptr_v(v) (tag_value_t)(v) 00224 #define tag_ptr_vr(v,x) (tag_value_t)(v) 00225 #define tag_cptr_v(v) (tag_value_t)(v) 00226 #define tag_cptr_vr(v,x) (tag_value_t)(v) 00227 #define tag_cstr_v(v) (tag_value_t)(v) 00228 #define tag_cstr_vr(v) (tag_value_t)(v) 00229 #define tag_str_v(v) (tag_value_t)(v) 00230 #define tag_str_vr(v) (tag_value_t)(v) 00231 #define tag_filter_v(v) (tag_value_t)(v) 00232 #endif 00233 00234 SOFIA_END_DECLS 00235 00236 #endif