]> git.sur5r.net Git - openldap/blobdiff - libraries/libmdb/midl.h
Fix valgrind call after malloc failure in mdb.
[openldap] / libraries / libmdb / midl.h
index a08046308c6de8b6d46cd724b043d122852028e6..87c876803134b72fb72baf6ef18ca84fe7720200 100644 (file)
@@ -11,7 +11,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2000-2011 The OpenLDAP Foundation.
+ * Copyright 2000-2012 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #ifndef _MDB_MIDL_H_
 #define _MDB_MIDL_H_
 
+#include <stddef.h>
+
 /** @defgroup internal MDB Internals
  *     @{
  */
+
 /** @defgroup idls     ID List Management
  *     @{
  */
-       /** An ID should be the largest integer type supported on a machine.
+       /** A generic ID number. These were entryIDs in back-bdb.
+        *      It should be the largest integer type supported on a machine.
+        *      It should be equal to the size of a pointer.
         */
-#define        ID      unsigned long
+typedef size_t ID;
 
        /** An IDL is an ID List, a sorted array of IDs. The first
         * element of the array is a counter for how many actual
@@ -97,12 +102,51 @@ typedef ID *IDL;
 #define MDB_IDL_N( ids )               ( MDB_IDL_IS_RANGE(ids) \
        ? ((ids)[2]-(ids)[1])+1 : (ids)[0] )
 
+#if 0  /* superseded by append/sort */
        /** Insert an ID into an IDL.
         * @param[in,out] ids   The IDL to insert into.
         * @param[in] id        The ID to insert.
         * @return      0 on success, -1 if the ID was already present in the IDL.
         */
 int mdb_midl_insert( IDL ids, ID id );
+#endif
+
+       /** Allocate an IDL.
+        * Allocates memory for an IDL of a default size.
+        * @return      IDL on success, NULL on failure.
+        */
+IDL mdb_midl_alloc();
+
+       /** Free an IDL.
+        * @param[in] ids       The IDL to free.
+        */
+void mdb_midl_free(IDL ids);
+
+       /** Shrink an IDL.
+        * Return the IDL to the default size if it has grown larger.
+        * @param[in,out] idp   Address of the IDL to shrink.
+        * @return      0 on no change, non-zero if shrunk.
+        */
+int mdb_midl_shrink(IDL *idp);
+
+       /** Append an ID onto an IDL.
+        * @param[in,out] idp   Address of the IDL to append to.
+        * @param[in] id        The ID to append.
+        * @return      0 on success, -1 if the IDL is too large.
+        */
+int mdb_midl_append( IDL *idp, ID id );
+
+       /** Append an IDL onto an IDL.
+        * @param[in,out] idp   Address of the IDL to append to.
+        * @param[in] app       The IDL to append.
+        * @return      0 on success, -1 if the IDL is too large.
+        */
+int mdb_midl_append_list( IDL *idp, IDL app );
+
+       /** Sort an IDL.
+        * @param[in,out] ids   The IDL to sort.
+        */
+void mdb_midl_sort( IDL ids );
 
        /** An ID2 is an ID/pointer pair.
         */
@@ -129,7 +173,7 @@ unsigned mdb_mid2l_search( ID2L ids, ID id );
        /** Insert an ID2 into a ID2L.
         * @param[in,out] ids   The ID2L to insert into.
         * @param[in] id        The ID2 to insert.
-        * @return      0 on success, -1 if the ID was already present in the MIDL2.
+        * @return      0 on success, -1 if the ID was already present in the ID2L.
         */
 int mdb_mid2l_insert( ID2L ids, ID2 *id );