+
+def camel_to_snake(s):
+ # Convert camel case to snake case, in a way that appears to match cbindgen
+ con = "_"
+ ret = ""
+ lastchar = ""
+ lastund = False
+ for char in s:
+ if lastchar.isupper():
+ if not char.isupper() and not lastund:
+ ret = ret + "_"
+ lastund = True
+ else:
+ lastund = False
+ ret = ret + lastchar.lower()
+ else:
+ ret = ret + lastchar
+ if char.isupper() and not lastund:
+ ret = ret + "_"
+ lastund = True
+ else:
+ lastund = False
+ lastchar = char
+ if char.isnumeric():
+ lastund = True
+ return (ret + lastchar.lower()).strip("_")
+
+unitary_enums = set()
+var_is_arr_regex = re.compile("\(\*([A-za-z0-9_]*)\)\[([a-z0-9]*)\]")
+var_ty_regex = re.compile("([A-za-z_0-9]*)(.*)")
+def java_c_types(fn_arg, ret_arr_len):
+ fn_arg = fn_arg.strip()
+ if fn_arg.startswith("MUST_USE_RES "):
+ fn_arg = fn_arg[13:]
+ is_const = False
+ if fn_arg.startswith("const "):
+ fn_arg = fn_arg[6:]
+ is_const = True
+
+ is_ptr = False
+ take_by_ptr = False
+ rust_obj = None
+ arr_access = None
+ if fn_arg.startswith("LDKThirtyTwoBytes"):
+ fn_arg = "uint8_t (*" + fn_arg[18:] + ")[32]"
+ assert var_is_arr_regex.match(fn_arg[8:])
+ rust_obj = "LDKThirtyTwoBytes"
+ arr_access = "data"
+ if fn_arg.startswith("LDKPublicKey"):
+ fn_arg = "uint8_t (*" + fn_arg[13:] + ")[33]"
+ assert var_is_arr_regex.match(fn_arg[8:])
+ rust_obj = "LDKPublicKey"
+ arr_access = "compressed_form"
+ if fn_arg.startswith("LDKSecretKey"):
+ fn_arg = "uint8_t (*" + fn_arg[13:] + ")[32]"
+ assert var_is_arr_regex.match(fn_arg[8:])
+ rust_obj = "LDKSecretKey"
+ arr_access = "bytes"
+ if fn_arg.startswith("LDKSignature"):
+ fn_arg = "uint8_t (*" + fn_arg[13:] + ")[64]"
+ assert var_is_arr_regex.match(fn_arg[8:])
+ rust_obj = "LDKSignature"
+ arr_access = "compact_form"
+ if fn_arg.startswith("LDKThreeBytes"):
+ fn_arg = "uint8_t (*" + fn_arg[14:] + ")[3]"
+ assert var_is_arr_regex.match(fn_arg[8:])
+ rust_obj = "LDKThreeBytes"
+ arr_access = "data"
+ if fn_arg.startswith("LDKu8slice"):
+ fn_arg = "uint8_t (*" + fn_arg[11:] + ")[datalen]"
+ assert var_is_arr_regex.match(fn_arg[8:])
+ rust_obj = "LDKu8slice"
+ arr_access = "data"
+ if fn_arg.startswith("LDKCVecTempl_u8"):
+ fn_arg = "uint8_t (*" + fn_arg[11:] + ")[datalen]"
+ assert var_is_arr_regex.match(fn_arg[8:])
+ rust_obj = "LDKCVecTempl_u8"
+ arr_access = "data"
+
+ if fn_arg.startswith("void"):
+ java_ty = "void"
+ c_ty = "void"
+ fn_ty_arg = "V"
+ fn_arg = fn_arg[4:].strip()
+ elif fn_arg.startswith("bool"):
+ java_ty = "boolean"
+ c_ty = "jboolean"
+ fn_ty_arg = "Z"
+ fn_arg = fn_arg[4:].strip()
+ elif fn_arg.startswith("uint8_t"):
+ java_ty = "byte"
+ c_ty = "jbyte"
+ fn_ty_arg = "B"
+ fn_arg = fn_arg[7:].strip()
+ elif fn_arg.startswith("uint16_t"):
+ java_ty = "short"
+ c_ty = "jshort"
+ fn_ty_arg = "S"
+ fn_arg = fn_arg[8:].strip()
+ elif fn_arg.startswith("uint32_t"):
+ java_ty = "int"
+ c_ty = "jint"
+ fn_ty_arg = "I"
+ fn_arg = fn_arg[8:].strip()
+ elif fn_arg.startswith("uint64_t") or fn_arg.startswith("uintptr_t"):
+ java_ty = "long"
+ c_ty = "jlong"
+ fn_ty_arg = "J"
+ if fn_arg.startswith("uint64_t"):
+ fn_arg = fn_arg[8:].strip()
+ else:
+ fn_arg = fn_arg[9:].strip()
+ elif is_const and fn_arg.startswith("char *"):
+ java_ty = "String"
+ c_ty = "const char*"
+ fn_ty_arg = "Ljava/lang/String;"
+ fn_arg = fn_arg[6:].strip()
+ else:
+ ma = var_ty_regex.match(fn_arg)
+ if ma.group(1).strip() in unitary_enums:
+ java_ty = ma.group(1).strip()
+ c_ty = "jclass"
+ fn_ty_arg = "Lorg/ldk/enums/" + ma.group(1).strip() + ";"
+ fn_arg = ma.group(2).strip()
+ rust_obj = ma.group(1).strip()
+ take_by_ptr = True
+ else:
+ java_ty = "long"
+ c_ty = "jlong"
+ fn_ty_arg = "J"
+ fn_arg = ma.group(2).strip()
+ rust_obj = ma.group(1).strip()
+ take_by_ptr = True
+
+ if fn_arg.startswith(" *") or fn_arg.startswith("*"):
+ fn_arg = fn_arg.replace("*", "").strip()
+ is_ptr = True
+ c_ty = "jlong"
+ java_ty = "long"
+ fn_ty_arg = "J"
+
+ var_is_arr = var_is_arr_regex.match(fn_arg)
+ if var_is_arr is not None or ret_arr_len is not None:
+ assert(not take_by_ptr)
+ assert(not is_ptr)
+ java_ty = java_ty + "[]"
+ c_ty = c_ty + "Array"
+ if var_is_arr is not None:
+ if var_is_arr.group(1) == "":
+ return TypeInfo(rust_obj=rust_obj, java_ty=java_ty, java_fn_ty_arg="[" + fn_ty_arg, c_ty=c_ty,
+ passed_as_ptr=False, is_ptr=False, var_name="arg", arr_len=var_is_arr.group(2), arr_access=arr_access)
+ return TypeInfo(rust_obj=rust_obj, java_ty=java_ty, java_fn_ty_arg="[" + fn_ty_arg, c_ty=c_ty,
+ passed_as_ptr=False, is_ptr=False, var_name=var_is_arr.group(1), arr_len=var_is_arr.group(2), arr_access=arr_access)
+ return TypeInfo(rust_obj=rust_obj, java_ty=java_ty, java_fn_ty_arg=fn_ty_arg, c_ty=c_ty, passed_as_ptr=is_ptr or take_by_ptr,
+ is_ptr=is_ptr, var_name=fn_arg, arr_len=None, arr_access=None)
+