Subject: Re: FTBFS with OCaml 5.2.0 (Uses C functions without caml_ prefix)

From: Stéphane Glondu <[email-masked]>
Date: Fri, 9 Aug 2024 20:15:18 +0200

Control: tags -1 + patch

On Thu, 20 Jun 2024 06:36:04 +0000 Stephane Glondu <[email-masked]> 
wrote:
> Your package FTBFS with OCaml 5.2.0 for the following reason:
> 
>   Uses C functions without caml_ prefix

Attached is a patch that fixes the build.

Cheers,

-- 
Stéphane

From: Stéphane Glondu <[email-masked]>
Date: Fri, 9 Aug 2024 20:11:24 +0200
X-Dgit-Generated: 1.1.6+git20210302.c3ba6d5a-4.1 d9c40cddf389933f2f4132002f1f22a98b4a45d0
Subject: Fix compilation with OCaml 5.2.0

Bug-Debian: https://bugs.debian.org/1073911

---

diff --git a/bdb/bdb_stubs.c b/bdb/bdb_stubs.c
index 959ee27..87bcd5d 100644
--- a/bdb/bdb_stubs.c
+++ b/bdb/bdb_stubs.c
@@ -59,7 +59,7 @@ static void dbt_from_string(DBT *dbt, value v) {
   zerob(dbt, sizeof(*dbt));
 
   dbt->data = (void *)String_val(v);
-  dbt->size = string_length(v);
+  dbt->size = caml_string_length(v);
 }
 
 #if OCAML_VERSION < 40600
@@ -75,19 +75,19 @@ static value caml_alloc_initialized_string(size_t len, const char *p)
 
 #define test_cursor_closed(cursor) \
   if (UW_cursor_closed(cursor)) \
-   invalid_argument("Attempt to use closed cursor")
+   caml_invalid_argument("Attempt to use closed cursor")
 
 #define test_dbenv_closed(dbenv) \
   if (UW_dbenv_closed(dbenv)) \
-   invalid_argument("Attempt to use closed dbenv")
+   caml_invalid_argument("Attempt to use closed dbenv")
 
 #define test_db_closed(db) \
   if (UW_db_closed(db))  \
-   invalid_argument("Attempt to use closed db")
+   caml_invalid_argument("Attempt to use closed db")
 
 #define test_txn_closed(txn) \
   if (UW_txn_closed(txn)) \
-    invalid_argument("Attempt to use closed txn")
+    caml_invalid_argument("Attempt to use closed txn")
 
 // comments starting with "//+" are extracted automatically to create the .ml
 // file that forms the caml side of this interface.
@@ -239,15 +239,15 @@ value caml_db_init(value v){
 //+ type db
 
 void raise_db(const char *msg) {
-  raise_with_string(*caml_db_exn, msg);
+  caml_raise_with_string(*caml_db_exn, msg);
 }
 
 void raise_key_exists() {
-  raise_constant(*caml_key_exists_exn);
+  caml_raise_constant(*caml_key_exists_exn);
 }
 
 void raise_run_recovery() {
-  raise_constant(*caml_db_run_recovery_exn);
+  caml_raise_constant(*caml_db_run_recovery_exn);
 }
 
 // Used as callback by db infrastructure for setting errors.  As a result,
@@ -321,7 +321,7 @@ value caml_dbenv_create(value unit){
 
   dbenv->set_errcall(dbenv,raise_db_cb);
 
-  rval = alloc_custom(&dbenv_custom,Camldbenv_wosize,0,1);
+  rval = caml_alloc_custom(&dbenv_custom,Camldbenv_wosize,0,1);
   UW_dbenv(rval) = dbenv;
   UW_dbenv_closed(rval) = False;
   CAMLreturn (rval);
@@ -335,7 +335,7 @@ value caml_dbenv_open(value dbenv, value vdirectory,
   CAMLparam4(dbenv,vdirectory,vflags,vmode);
   int err;
   const char *directory = String_val(vdirectory);
-  int flags = convert_flag_list(vflags,dbenv_open_flags);
+  int flags = caml_convert_flag_list(vflags,dbenv_open_flags);
 
   test_dbenv_closed(dbenv);
 
@@ -416,7 +416,7 @@ value caml_dbenv_set_verbose(value dbenv, value vflags,
   CAMLparam3(dbenv,vflags,v_onoff);
   int err;
 
-  int which = convert_flag_list(vflags,dbenv_verbose_flags) + 1;
+  int which = caml_convert_flag_list(vflags,dbenv_verbose_flags) + 1;
   int onoff = Bool_val(v_onoff);
 
   test_dbenv_closed(dbenv);
@@ -524,8 +524,8 @@ value caml_db_create(value dbenv_opt, value vflags){
 
   /* The flags parameter is currently unused, and must be set to 0. */
   if (vflags != Val_emptylist)
-    invalid_argument("DB.create invalid create flag");
-  flags = convert_flag_list(vflags,db_create_flags);
+    caml_invalid_argument("DB.create invalid create flag");
+  flags = caml_convert_flag_list(vflags,db_create_flags);
 
   if (Is_None(dbenv_opt)) { dbenv = NULL; }
   else {
@@ -538,7 +538,7 @@ value caml_db_create(value dbenv_opt, value vflags){
 
   db->set_errcall(db,raise_db_cb);
 
-  rval = alloc_custom(&db_custom,Camldb_wosize,0,1);
+  rval = caml_alloc_custom(&db_custom,Camldb_wosize,0,1);
   UW_db(rval) = db;
   UW_db_closed(rval) = False;
   CAMLreturn (rval);
@@ -553,7 +553,7 @@ value caml_db_open(value db, value vfname,
   CAMLparam5(db, vfname, vdbtype, vflags, vmode);
   int err;
   const char *fname = String_val(vfname);
-  int flags = convert_flag_list(vflags,db_open_flags);
+  int flags = caml_convert_flag_list(vflags,db_open_flags);
   int dbtype = Flag_val(vdbtype,db_types);
 
   test_db_closed(db);
@@ -630,7 +630,7 @@ value caml_db_put(value db, value txn_opt, value vkey,
 
   dbt_from_string(&key, vkey);
   dbt_from_string(&data, vdata);
-  flags = convert_flag_list(vflags, db_put_flags);
+  flags = caml_convert_flag_list(vflags, db_put_flags);
 
   err = UW_db(db)->put(UW_db(db), txn, &key, &data, flags);
   if (err != 0) {
@@ -661,12 +661,12 @@ value caml_db_get(value db, value txn_opt, value vkey, value vflags) {
 
   zerob(&data,sizeof(DBT));
   dbt_from_string(&key, vkey);
-  flags = convert_flag_list(vflags, db_get_flags);
+  flags = caml_convert_flag_list(vflags, db_get_flags);
 
   err = UW_db(db)->get(UW_db(db), txn, &key, &data, flags);
   if (err != 0) {
     ////fprintf(stderr,"Error found: %d\n",err); fflush(stderr);
-    if (err == DB_NOTFOUND) { raise_not_found(); }
+    if (err == DB_NOTFOUND) { caml_raise_not_found(); }
     UW_db(db)->err(UW_db(db),err,"caml_db_get");
   }
 
@@ -683,7 +683,7 @@ value caml_db_set_flags(value db, value vflags) {
 
   test_db_closed(db);
 
-  flags = convert_flag_list(vflags,db_set_flags);
+  flags = caml_convert_flag_list(vflags,db_set_flags);
 
   err = UW_db(db)->set_flags(UW_db(db),flags);
   if (err != 0) { UW_db(db)->err(UW_db(db),err,"caml_db_set_flags"); }
@@ -873,7 +873,7 @@ value caml_cursor_create(value vwritecursor, value txn_opt, value db) {
     UW_db(db)->err(UW_db(db),err, "caml_cursor_create");
   }
 
-  rval = alloc_custom(&cursor_custom,Camlcursor_wosize,0,1);
+  rval = caml_alloc_custom(&cursor_custom,Camlcursor_wosize,0,1);
 
   UW_cursor(rval) = cursor;
   UW_cursor_closed(rval) = False;
@@ -944,7 +944,7 @@ value caml_cursor_init(value cursor, value vkey, value vflags) {
   CAMLparam3(cursor,vkey,vflags);
   CAMLlocal1(rval);
   DBT key,data;
-  int flags = convert_flag_list(vflags,cursor_get_flags) | DB_SET;
+  int flags = caml_convert_flag_list(vflags,cursor_get_flags) | DB_SET;
   int err;
 
   test_cursor_closed(cursor);
@@ -954,7 +954,7 @@ value caml_cursor_init(value cursor, value vkey, value vflags) {
 
   err = UW_cursor(cursor)->c_get(UW_cursor(cursor), &key, &data, flags);
   if (err != 0) {
-    if (err == DB_NOTFOUND) { raise_not_found(); }
+    if (err == DB_NOTFOUND) { caml_raise_not_found(); }
     raise_db(db_strerror(err));
   }
 
@@ -969,7 +969,7 @@ value caml_cursor_init_range(value cursor, value vkey, value vflags) {
   CAMLparam3(cursor,vkey,vflags);
   CAMLlocal3(rkey,rdata,rpair);
   DBT key,data;
-  int flags = convert_flag_list(vflags,cursor_get_flags) | DB_SET_RANGE;
+  int flags = caml_convert_flag_list(vflags,cursor_get_flags) | DB_SET_RANGE;
   int err;
 
   test_cursor_closed(cursor);
@@ -979,7 +979,7 @@ value caml_cursor_init_range(value cursor, value vkey, value vflags) {
 
   err = UW_cursor(cursor)->c_get(UW_cursor(cursor), &key, &data, flags);
   if (err != 0) {
-    if (err == DB_NOTFOUND) { raise_not_found(); }
+    if (err == DB_NOTFOUND) { caml_raise_not_found(); }
     raise_db(db_strerror(err));
   }
 
@@ -1005,7 +1005,7 @@ value caml_cursor_init_both(value cursor, value vkey,
 
    int ctr = 0;
 
-   flags = convert_flag_list(vflags,cursor_get_flags) | DB_GET_BOTH;
+   flags = caml_convert_flag_list(vflags,cursor_get_flags) | DB_GET_BOTH;
    test_cursor_closed(cursor);
 
    dbt_from_string(&key, vkey);
@@ -1013,7 +1013,7 @@ value caml_cursor_init_both(value cursor, value vkey,
 
    err = UW_cursor(cursor)->c_get(UW_cursor(cursor), &key, &data, flags);
    if (err != 0) {
-     if (err == DB_NOTFOUND) { raise_not_found (); }
+     if (err == DB_NOTFOUND) { caml_raise_not_found (); }
      raise_db(db_strerror(err));
    }
 
@@ -1028,7 +1028,7 @@ value caml_cursor_get(value cursor, value vtype, value vflags) {
   CAMLlocal3(rpair,rkey,rdata);
   DBT key,data;
   int flags = Flag_val(vtype,cursor_get_type) |
-    convert_flag_list(vflags,cursor_get_flags);
+    caml_convert_flag_list(vflags,cursor_get_flags);
   int err;
   zerob(&key,sizeof(DBT)); zerob(&data,sizeof(DBT));
 
@@ -1036,7 +1036,7 @@ value caml_cursor_get(value cursor, value vtype, value vflags) {
 
   err = UW_cursor(cursor)->c_get(UW_cursor(cursor), &key, &data,flags);
   if (err != 0) {
-    if (err == DB_NOTFOUND) { raise_not_found(); }
+    if (err == DB_NOTFOUND) { caml_raise_not_found(); }
     raise_db(db_strerror(err));
   }
 
@@ -1056,7 +1056,7 @@ value caml_cursor_get_keyonly(value cursor, value vtype, value vflags) {
   CAMLlocal1(rkey);
   DBT key,data;
   int flags = Flag_val(vtype,cursor_get_type) |
-    convert_flag_list(vflags,cursor_get_flags);
+    caml_convert_flag_list(vflags,cursor_get_flags);
   int err;
   zerob(&key,sizeof(DBT)); zerob(&data,sizeof(DBT));
 
@@ -1064,7 +1064,7 @@ value caml_cursor_get_keyonly(value cursor, value vtype, value vflags) {
 
   err = UW_cursor(cursor)->c_get(UW_cursor(cursor), &key, &data,flags);
   if (err != 0) {
-    if (err == DB_NOTFOUND) { raise_not_found(); }
+    if (err == DB_NOTFOUND) { caml_raise_not_found(); }
     raise_db(db_strerror(err));
   }
 
@@ -1118,7 +1118,7 @@ value caml_cursor_dup(value vkeep_position, value cursor) {
   err = UW_cursor(cursor)->c_dup(UW_cursor(cursor), &newcursor, flags);
   if (err != 0) { raise_db(db_strerror(err)); }
 
-  rval = alloc_custom(&cursor_custom,Camlcursor_wosize,0,1);
+  rval = caml_alloc_custom(&cursor_custom,Camlcursor_wosize,0,1);
   UW_cursor(rval) = newcursor;
   UW_cursor_closed(rval) = False;
 
@@ -1136,7 +1136,7 @@ value caml_join_cursors(value vnosort, value db,
   CAMLlocal1(rval);
   DBC *jcurs; // pointer to joined cursor
   int carray_len = Wosize_val(vcursors);
-  int flags = convert_flag_list(vflags,cursor_get_flags);
+  int flags = caml_convert_flag_list(vflags,cursor_get_flags);
   DBC *cursors[carray_len + 1];
   int i;
 
@@ -1146,7 +1146,7 @@ value caml_join_cursors(value vnosort, value db,
 
   for (i=0; i < carray_len; i++) {
     if (UW_cursor_closed(Field(vcursors,i))) {
-      invalid_argument("caml_join_cursors: Attempt to use closed cursor");
+      caml_invalid_argument("caml_join_cursors: Attempt to use closed cursor");
     }
     cursors[i] = UW_cursor(Field(vcursors,i));
   }
@@ -1156,7 +1156,7 @@ value caml_join_cursors(value vnosort, value db,
   UW_db(db)->join(UW_db(db),cursors,&jcurs,flags);

-  rval = alloc_custom(&cursor_custom,Camlcursor_wosize,0,1);
+  rval = caml_alloc_custom(&cursor_custom,Camlcursor_wosize,0,1);
   UW_cursor(rval) = jcurs;
   UW_cursor_closed(rval) = False;
   CAMLreturn (rval);
@@ -1209,7 +1209,7 @@ value caml_set_txn_max(value dbenv, value vmax) {
   if (err != 0) {
     //fprintf(stderr,"Error found: %d\n",err); fflush(stderr);
     if (err == EINVAL) {
-      invalid_argument("set_txn_max called after dbenv opened");
+      caml_invalid_argument("set_txn_max called after dbenv opened");
     } else {
       UW_dbenv(dbenv)->err(UW_dbenv(dbenv), err, "caml_set_txn_max");
     }
@@ -1247,7 +1247,7 @@ value caml_txn_begin(value dbenv, value parent_opt, value vflags) {
 
   test_dbenv_closed(dbenv);
 
-  flags = convert_flag_list(vflags,txn_begin_flags);
+  flags = caml_convert_flag_list(vflags,txn_begin_flags);
 
   if (Is_None(parent_opt)) { parent = NULL; }
   else {
@@ -1259,13 +1259,13 @@ value caml_txn_begin(value dbenv, value parent_opt, value vflags) {
   err = UW_dbenv(dbenv)->txn_begin(UW_dbenv(dbenv), parent, &newtxn, flags);
   if (err != 0) {
     if (err == ENOMEM) {
-      failwith("Maximum # of concurrent transactions reached");
+      caml_failwith("Maximum # of concurrent transactions reached");
     } else {
       UW_dbenv(dbenv)->err(UW_dbenv(dbenv), err,"caml_txn_begin");
     }
   }
 
-  rval = alloc_custom(&txn_custom,Camltxn_wosize,0,1);
+  rval = caml_alloc_custom(&txn_custom,Camltxn_wosize,0,1);
   UW_txn(rval) = newtxn;
   UW_txn_closed(rval) = False;
   CAMLreturn(rval);
@@ -1283,13 +1283,13 @@ value caml_txn_checkpoint(value dbenv, value vkbyte, value vmin,
 
   kbyte = Int_val(vkbyte);
   min = Int_val(vmin);
-  flags = convert_flag_list(vflags,txn_checkpoint_flags);
+  flags = caml_convert_flag_list(vflags,txn_checkpoint_flags);
 
   err = UW_dbenv(dbenv)->txn_checkpoint(UW_dbenv(dbenv),kbyte,min,flags);
   if (err != 0) {
     //fprintf(stderr,"Error found: %d\n",err); fflush(stderr);
     if (err == EINVAL) {
-      invalid_argument("caml_txn_checkpoint: no reason specified");
+      caml_invalid_argument("caml_txn_checkpoint: no reason specified");
     } else {
       UW_dbenv(dbenv)->err(UW_dbenv(dbenv), err, "caml_txn_checkpoint");
     }
@@ -1304,7 +1304,7 @@ value caml_txn_commit(value txn, value vflags) {
   int err, flags;
 
   test_txn_closed(txn);
-  flags = convert_flag_list(vflags,txn_commit_flags);
+  flags = caml_convert_flag_list(vflags,txn_commit_flags);
 
   err = UW_txn(txn)->commit(UW_txn(txn),flags);
   UW_txn_closed(txn) = True; // transaction can never be used again
diff --git a/bdb/bdb_stubs.h b/bdb/bdb_stubs.h
index e9a77c8..994b991 100644
--- a/bdb/bdb_stubs.h
+++ b/bdb/bdb_stubs.h
@@ -60,5 +60,4 @@ struct camltxn {
 #define Is_string(v)   (Is_block(v) && (Tag_val(v) == String_tag))
 #define Is_None(v)  (!Is_block(v))
 #define Is_Some(v)  (Is_block(v))
-#define Some_val(v) (Field(v,0))
 #define Flag_val(vflag,flags) (flags[Long_val(vflag)])
diff --git a/common.ml b/common.ml
index c7b5f98..9939b4a 100644
--- a/common.ml
+++ b/common.ml
@@ -78,7 +78,7 @@ let stored_logfile_name = ref None
 (**************************************************************************)
 
 let plerror level format =
-  kprintf (fun s ->
+  ksprintf (fun s ->
              if !Settings.debug && level  <= !Settings.debuglevel
              then  (
                let tm = Unix.localtime (Unix.time ()) in
@@ -115,7 +115,7 @@ let reopen_logfile () =
 let perror x = plerror 3 x
 
 let eplerror level e format =
-  kprintf (fun s ->
+  ksprintf (fun s ->
              if !Settings.debug && level  <= !Settings.debuglevel
              then  (
                let tm = Unix.localtime (Unix.time ()) in
diff --git a/crc.c b/crc.c
index daafad3..2c570b0 100644
--- a/crc.c
+++ b/crc.c
@@ -51,7 +51,7 @@ value caml_crc_octets(value data) {
   CAMLparam1(data);
   CAMLlocal1(rval);
   unsigned const char *octets = String_val(data);
-  size_t len = string_length(data);
+  size_t len = caml_string_length(data);
   long crc = crc_octets(octets,len);
 
   rval = Val_int(crc);
@@ -63,8 +63,8 @@ value caml_get_tzname(value none) {
   CAMLparam1(none);
   CAMLlocal1(rval);
   tzset();
-  rval = alloc_tuple(2);
-  Store_field(rval,0,copy_string(tzname[0]));
-  Store_field(rval,1,copy_string(tzname[1]));
+  rval = caml_alloc_tuple(2);
+  Store_field(rval,0,caml_copy_string(tzname[0]));
+  Store_field(rval,1,caml_copy_string(tzname[1]));
   CAMLreturn(rval);
 }
diff --git a/utils.ml b/utils.ml
index c840b71..7efc316 100644
--- a/utils.ml
+++ b/utils.ml
@@ -102,10 +102,10 @@ let is_alnum char =
   (num >= int_of_char '0' && num <= int_of_char '9') ||
   (num >= 192 && num <= 255)
 
-let lowercase = String.lowercase[@@ocaml.warning "-3"]
-let uppercase = String.uppercase[@@ocaml.warning "-3"]
-let bytes_lowercase = Bytes.lowercase[@@ocaml.warning "-3"]
-let bytes_uppercase = Bytes.uppercase[@@ocaml.warning "-3"]
+let lowercase = String.lowercase_ascii[@@ocaml.warning "-3"]
+let uppercase = String.uppercase_ascii[@@ocaml.warning "-3"]
+let bytes_lowercase = Bytes.lowercase_ascii[@@ocaml.warning "-3"]
+let bytes_uppercase = Bytes.uppercase_ascii[@@ocaml.warning "-3"]
 
 let rec extract_words_rec s ~start ~len partial =
   let one () = Set.add (lowercase (String.sub s start len)) partial in