Alexandre Julliard : wldap32: Added a wrapper for ber_scanf.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Apr 18 14:34:59 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: ec9af18e96385a861de2b98a06d572d991ff7b61
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=ec9af18e96385a861de2b98a06d572d991ff7b61

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Apr 18 20:41:03 2006 +0200

wldap32: Added a wrapper for ber_scanf.

---

 dlls/wldap32/ber.c        |   85 ++++++++++++++++++++++++++++++++++++++++++---
 dlls/wldap32/wldap32.spec |    2 +
 2 files changed, 81 insertions(+), 6 deletions(-)

diff --git a/dlls/wldap32/ber.c b/dlls/wldap32/ber.c
index 8110a07..78fc39f 100644
--- a/dlls/wldap32/ber.c
+++ b/dlls/wldap32/ber.c
@@ -248,11 +248,86 @@ INT WLDAP32_ber_printf( BerElement *bere
 }
 
 
-#ifndef HAVE_LDAP
-
-INT ber_scanf( BerElement *berelement, PCHAR fmt, ... )
+/***********************************************************************
+ *      ber_scanf     (WLDAP32.@)
+ */
+INT WLDAP32_ber_scanf( BerElement *berelement, PCHAR fmt, ... )
 {
+#ifdef HAVE_LDAP
+    va_list list;
+    int ret = 0;
+    char new_fmt[2];
+
+    new_fmt[1] = 0;
+    va_start( list, fmt );
+    while (*fmt)
+    {
+        new_fmt[0] = *fmt++;
+        switch(new_fmt[0])
+        {
+        case 'a':
+            {
+                char **ptr = va_arg( list, char ** );
+                ret = ber_scanf( berelement, new_fmt, ptr );
+                break;
+            }
+        case 'b':
+        case 'e':
+        case 'i':
+            {
+                int *i = va_arg( list, int * );
+                ret = ber_scanf( berelement, new_fmt, i );
+                break;
+            }
+        case 't':
+            {
+                unsigned int *tag = va_arg( list, unsigned int * );
+                ret = ber_scanf( berelement, new_fmt, tag );
+                break;
+            }
+        case 'v':
+            {
+                char ***array = va_arg( list, char *** );
+                ret = ber_scanf( berelement, new_fmt, array );
+                break;
+            }
+        case 'B':
+            {
+                char **str = va_arg( list, char ** );
+                int *len = va_arg( list, int * );
+                ret = ber_scanf( berelement, new_fmt, str, len );
+                break;
+            }
+        case 'O':
+            {
+                struct berval **ptr = va_arg( list, struct berval ** );
+                ret = ber_scanf( berelement, new_fmt, ptr );
+                break;
+            }
+        case 'V':
+            {
+                struct berval ***array = va_arg( list, struct berval *** );
+                ret = ber_scanf( berelement, new_fmt, array );
+                break;
+            }
+        case 'n':
+        case 'x':
+        case '{':
+        case '}':
+        case '[':
+        case ']':
+            ret = ber_scanf( berelement, new_fmt );
+            break;
+        default:
+            FIXME( "Unknown format '%c'\n", new_fmt[0] );
+            ret = -1;
+            break;
+        }
+        if (ret == -1) break;
+    }
+    va_end( list );
+    return ret;
+#else
     return LBER_ERROR;
+#endif
 }
-
-#endif /* HAVE_LDAP */
diff --git a/dlls/wldap32/wldap32.spec b/dlls/wldap32/wldap32.spec
index 1c3a68a..048defe 100644
--- a/dlls/wldap32/wldap32.spec
+++ b/dlls/wldap32/wldap32.spec
@@ -226,7 +226,7 @@
 308 cdecl ber_next_element(ptr ptr ptr) WLDAP32_ber_next_element
 309 cdecl ber_flatten(ptr ptr) WLDAP32_ber_flatten
 310 varargs ber_printf(ptr str) WLDAP32_ber_printf
-311 varargs ber_scanf(ptr str)
+311 varargs ber_scanf(ptr str) WLDAP32_ber_scanf
 312 cdecl ldap_conn_from_msg(ptr ptr)
 313 cdecl ldap_sasl_bindW(ptr wstr wstr ptr ptr ptr ptr)
 314 cdecl ldap_sasl_bind_sW(ptr wstr wstr ptr ptr ptr ptr)




More information about the wine-cvs mailing list