-int TXT_DB_create_index(db,field,qual,hash,cmp)
-TXT_DB *db;
-int field;
-int (*qual)();
-unsigned long (*hash)();
-int (*cmp)();
- {
- LHASH *idx;
- char *r;
- int i,n;
+ if (field >= db->num_fields) {
+ db->error = DB_ERROR_INDEX_OUT_OF_RANGE;
+ return (0);
+ }
+ /* FIXME: we lose type checking at this point */
+ if ((idx = (LHASH_OF(OPENSSL_STRING) *)lh_new(hash, cmp)) == NULL) {
+ db->error = DB_ERROR_MALLOC;
+ return (0);
+ }
+ n = sk_OPENSSL_PSTRING_num(db->data);
+ for (i = 0; i < n; i++) {
+ r = sk_OPENSSL_PSTRING_value(db->data, i);
+ if ((qual != NULL) && (qual(r) == 0))
+ continue;
+ if ((r = lh_OPENSSL_STRING_insert(idx, r)) != NULL) {
+ db->error = DB_ERROR_INDEX_CLASH;
+ db->arg1 = sk_OPENSSL_PSTRING_find(db->data, r);
+ db->arg2 = i;
+ lh_OPENSSL_STRING_free(idx);
+ return (0);
+ }
+ }
+ if (db->index[field] != NULL)
+ lh_OPENSSL_STRING_free(db->index[field]);
+ db->index[field] = idx;
+ db->qual[field] = qual;
+ return (1);
+}