/* $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
* @{
*/
- /** ULONG should be the largest integer type supported on a machine.
- * It should be equal to the size of a pointer.
- */
-#define ULONG unsigned long
+
/** @defgroup idls ID List Management
* @{
*/
/** A generic ID number. These were entryIDs in back-bdb.
+ * Preferably it should have the same size as a pointer.
*/
-typedef ULONG ID;
+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
#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] ids The IDL to append to.
+ * @param[in,out] idp Address of the IDL to append to.
* @param[in] id The ID to append.
- * @return 0 on success, -2 if the IDL is too large.
+ * @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( IDL ids, ID id );
+int mdb_midl_append_list( IDL *idp, IDL app );
/** Sort an IDL.
* @param[in,out] ids The IDL to sort.
/** 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 );