]> git.sur5r.net Git - openldap/blobdiff - libraries/liblmdb/midl.c
Tweak MIDLs, catch errors.
[openldap] / libraries / liblmdb / midl.c
index 00df385cdc83363234f728434829c8eae26663e4..0fcedbe661d0edc6db5d758d247bffdebd9d3a7a 100644 (file)
@@ -120,8 +120,9 @@ void mdb_midl_free(MDB_IDL ids)
 int mdb_midl_shrink( MDB_IDL *idp )
 {
        MDB_IDL ids = *idp;
-       if (*(--ids) > MDB_IDL_UM_MAX) {
-               ids = realloc(ids, (MDB_IDL_UM_MAX+1) * sizeof(MDB_ID));
+       if (*(--ids) > MDB_IDL_UM_MAX &&
+               (ids = realloc(ids, (MDB_IDL_UM_MAX+1) * sizeof(MDB_ID))))
+       {
                *ids++ = MDB_IDL_UM_MAX;
                *idp = ids;
                return 1;
@@ -129,7 +130,7 @@ int mdb_midl_shrink( MDB_IDL *idp )
        return 0;
 }
 
-int mdb_midl_grow( MDB_IDL *idp, int num )
+static int mdb_midl_grow( MDB_IDL *idp, int num )
 {
        MDB_IDL idn = *idp-1;
        /* grow it */
@@ -141,6 +142,20 @@ int mdb_midl_grow( MDB_IDL *idp, int num )
        return 0;
 }
 
+int mdb_midl_need( MDB_IDL *idp, unsigned num )
+{
+       MDB_IDL ids = *idp;
+       num += ids[0];
+       if (num > ids[-1]) {
+               num = (num + num/4 + (256 + 2)) & -256;
+               if (!(ids = realloc(ids-1, num * sizeof(MDB_ID))))
+                       return ENOMEM;
+               *ids++ += num -= 2;
+               *idp = ids;
+       }
+       return 0;
+}
+
 int mdb_midl_append( MDB_IDL *idp, MDB_ID id )
 {
        MDB_IDL ids = *idp;
@@ -169,6 +184,22 @@ int mdb_midl_append_list( MDB_IDL *idp, MDB_IDL app )
        return 0;
 }
 
+int mdb_midl_append_range( MDB_IDL *idp, MDB_ID id, unsigned n )
+{
+       MDB_ID *ids = *idp, len = ids[0];
+       /* Too big? */
+       if (len + n > ids[-1]) {
+               if (mdb_midl_grow(idp, n | MDB_IDL_UM_MAX))
+                       return ENOMEM;
+               ids = *idp;
+       }
+       ids[0] = len + n;
+       ids += len;
+       while (n)
+               ids[n--] = id++;
+       return 0;
+}
+
 /* Quicksort + Insertion sort for small arrays */
 
 #define SMALL  8