windowscodecs: Silence fixme for IID_CMetaBitmapRenderTarget.
[wine.git] / dlls / wldap32 / ber.c
blobd38f0119dc49efd64f3791e857c9813a4c8186f1
1 /*
2 * WLDAP32 - LDAP support for Wine
4 * Copyright 2005 Hans Leidekker
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include <stdarg.h>
22 #include <stdlib.h>
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winnls.h"
27 #include "wine/debug.h"
28 #include "winldap_private.h"
30 WINE_DEFAULT_DEBUG_CHANNEL(wldap32);
32 /***********************************************************************
33 * ber_alloc_t (WLDAP32.@)
35 WLDAP32_BerElement * CDECL WLDAP32_ber_alloc_t( int options )
37 WLDAP32_BerElement *ret;
39 TRACE( "%d\n", options );
41 if (options != WLDAP32_LBER_USE_DER || !(ret = malloc( sizeof(*ret) ))) return NULL;
42 if ((ret->opaque = (char *)ber_alloc_t( options ))) return ret;
43 free( ret );
44 return NULL;
47 /***********************************************************************
48 * ber_bvdup (WLDAP32.@)
50 BERVAL * CDECL WLDAP32_ber_bvdup( BERVAL *berval )
52 TRACE( "%p\n", berval );
53 return bervalWtoW( berval );
56 /***********************************************************************
57 * ber_bvecfree (WLDAP32.@)
59 void CDECL WLDAP32_ber_bvecfree( BERVAL **berval )
61 TRACE( "%p\n", berval );
62 bvarrayfreeW( berval );
65 /***********************************************************************
66 * ber_bvfree (WLDAP32.@)
68 void CDECL WLDAP32_ber_bvfree( BERVAL *berval )
70 TRACE( "berval\n" );
71 free( berval );
74 /***********************************************************************
75 * ber_first_element (WLDAP32.@)
77 ULONG CDECL WLDAP32_ber_first_element( WLDAP32_BerElement *ber, ULONG *len, char **opaque )
79 TRACE( "%p, %p, %p\n", ber, len, opaque );
80 return ber_first_element( BER(ber), len, opaque );
83 /***********************************************************************
84 * ber_flatten (WLDAP32.@)
86 int CDECL WLDAP32_ber_flatten( WLDAP32_BerElement *ber, BERVAL **berval )
88 struct berval *bervalU;
89 struct WLDAP32_berval *bervalW;
91 TRACE( "%p, %p\n", ber, berval );
93 if (ber_flatten( BER(ber), &bervalU )) return WLDAP32_LBER_ERROR;
95 bervalW = bervalUtoW( bervalU );
96 ber_bvfree( bervalU );
97 if (!bervalW)
98 return WLDAP32_LBER_ERROR;
100 *berval = bervalW;
101 return 0;
104 /***********************************************************************
105 * ber_free (WLDAP32.@)
107 void CDECL WLDAP32_ber_free( WLDAP32_BerElement *ber, int freebuf )
109 TRACE( "%p, %d\n", ber, freebuf );
110 ber_free( BER(ber), freebuf );
111 free( ber );
114 /***********************************************************************
115 * ber_init (WLDAP32.@)
117 WLDAP32_BerElement * CDECL WLDAP32_ber_init( BERVAL *berval )
119 struct berval *bervalU;
120 WLDAP32_BerElement *ret;
121 BerElement *ber;
123 TRACE( "%p\n", berval );
125 if (!(ret = malloc( sizeof(*ret) ))) return NULL;
126 if (!(bervalU = bervalWtoU( berval )))
128 free( ret );
129 return NULL;
132 ber = ber_init( bervalU );
133 free( bervalU );
134 if ((ret->opaque = (char *)ber)) return ret;
135 free( ret );
136 return NULL;
139 /***********************************************************************
140 * ber_next_element (WLDAP32.@)
142 ULONG CDECL WLDAP32_ber_next_element( WLDAP32_BerElement *ber, ULONG *len, char *opaque )
144 TRACE( "%p, %p, %p\n", ber, len, opaque );
145 return ber_next_element( BER(ber), len, opaque );
148 /***********************************************************************
149 * ber_peek_tag (WLDAP32.@)
151 ULONG CDECL WLDAP32_ber_peek_tag( WLDAP32_BerElement *ber, ULONG *len )
153 TRACE( "%p, %p\n", ber, len );
154 return ber_peek_tag( BER(ber), len );
157 /***********************************************************************
158 * ber_skip_tag (WLDAP32.@)
160 ULONG CDECL WLDAP32_ber_skip_tag( WLDAP32_BerElement *ber, ULONG *len )
162 TRACE( "%p, %p\n", ber, len );
163 return ber_skip_tag( BER(ber), len );
166 /***********************************************************************
167 * ber_printf (WLDAP32.@)
169 int WINAPIV WLDAP32_ber_printf( WLDAP32_BerElement *ber, char *fmt, ... )
171 va_list list;
172 int ret = 0;
173 char new_fmt[2];
175 TRACE( "%p(%p), %s\n", ber, ber->opaque, fmt );
177 new_fmt[1] = 0;
178 va_start( list, fmt );
179 while (*fmt)
181 new_fmt[0] = *fmt++;
182 switch (new_fmt[0])
184 case 'b':
185 case 'e':
186 case 'i':
188 int arg = va_arg( list, int );
189 ret = ber_printf( BER(ber), new_fmt, arg );
190 break;
192 case 'o':
193 case 's':
195 char *arg = va_arg( list, char * );
196 ret = ber_printf( BER(ber), new_fmt, arg );
197 break;
199 case 't':
201 unsigned int arg = va_arg( list, unsigned int );
202 ret = ber_printf( BER(ber), new_fmt, arg );
203 break;
205 case 'v':
207 char **arg = va_arg( list, char ** );
208 ret = ber_printf( BER(ber), new_fmt, arg );
209 break;
211 case 'V':
213 struct WLDAP32_berval **array = va_arg( list, struct WLDAP32_berval ** );
214 struct berval **arrayU;
215 if (!(arrayU = bvarrayWtoU( array )))
217 ret = -1;
218 break;
220 ret = ber_printf( BER(ber), new_fmt, arrayU );
221 bvarrayfreeU( arrayU );
222 break;
224 case 'X':
226 char *arg = va_arg( list, char * );
227 int arg2 = va_arg( list, int );
228 new_fmt[0] = 'B'; /* 'X' is deprecated */
229 ret = ber_printf( BER(ber), new_fmt, arg, arg2 );
230 break;
232 case 'n':
233 case '{':
234 case '}':
235 case '[':
236 case ']':
237 ret = ber_printf( BER(ber), new_fmt );
238 break;
240 default:
241 FIXME( "Unknown format '%c'\n", new_fmt[0] );
242 ret = -1;
243 break;
245 if (ret == -1) break;
247 va_end( list );
248 return ret;
251 /***********************************************************************
252 * ber_scanf (WLDAP32.@)
254 ULONG WINAPIV WLDAP32_ber_scanf( WLDAP32_BerElement *ber, char *fmt, ... )
256 va_list list;
257 int ret = 0;
258 char new_fmt[2];
260 TRACE( "%p, %s\n", ber, fmt );
262 new_fmt[1] = 0;
263 va_start( list, fmt );
264 while (*fmt)
266 new_fmt[0] = *fmt++;
267 switch (new_fmt[0])
269 case 'a':
271 char *str, **ptr = va_arg( list, char ** );
272 if ((ret = ber_scanf( BER(ber), new_fmt, &str )) == -1) break;
273 *ptr = strdup( str );
274 ldap_memfree( str );
275 break;
277 case 'b':
278 case 'e':
279 case 'i':
281 int *arg = va_arg( list, int * );
282 ret = ber_scanf( BER(ber), new_fmt, arg );
283 break;
285 case 't':
287 unsigned int *arg = va_arg( list, unsigned int * );
288 ret = ber_scanf( BER(ber), new_fmt, arg );
289 break;
291 case 'v':
293 char *str, **arrayU, **ptr, ***array = va_arg( list, char *** );
294 if ((ret = ber_scanf( BER(ber), new_fmt, &arrayU )) == -1) break;
295 *array = strarrayUtoU( arrayU );
296 ptr = arrayU;
297 while ((str = *ptr))
299 ldap_memfree( str );
300 ptr++;
302 ldap_memfree( arrayU );
303 break;
305 case 'B':
307 char *strU, **str = va_arg( list, char ** );
308 int *len = va_arg( list, int * );
309 if ((ret = ber_scanf( BER(ber), new_fmt, &strU, len )) == -1) break;
310 *str = malloc( *len );
311 memcpy( *str, strU, *len );
312 ldap_memfree( strU );
313 break;
315 case 'O':
317 struct WLDAP32_berval **berval = va_arg( list, struct WLDAP32_berval ** );
318 struct berval *bervalU;
319 if ((ret = ber_scanf( BER(ber), new_fmt, &bervalU )) == -1) break;
320 *berval = bervalUtoW( bervalU );
321 ber_bvfree( bervalU );
322 break;
324 case 'V':
326 struct WLDAP32_berval ***array = va_arg( list, struct WLDAP32_berval *** );
327 struct berval **arrayU;
328 if ((ret = ber_scanf( BER(ber), new_fmt, &arrayU )) == -1) break;
329 *array = bvarrayUtoW( arrayU );
330 ber_bvecfree( arrayU );
331 break;
333 case 'n':
334 case 'x':
335 case '{':
336 case '}':
337 case '[':
338 case ']':
339 ret = ber_scanf( BER(ber), new_fmt );
340 break;
342 default:
343 FIXME( "Unknown format '%c'\n", new_fmt[0] );
344 ret = -1;
345 break;
347 if (ret == -1) break;
349 va_end( list );
350 return ret;