sig
  type error =
      Partial
    | BadPartial
    | BadPattern of string * int
    | BadUTF8
    | BadUTF8Offset
    | MatchLimit
    | RecursionLimit
    | InternalError of string
  exception Error of Pcre.error
  exception Backtrack
  exception Regexp_or of string * Pcre.error
  type icflag
  and irflag
  and cflag =
      [ `ANCHORED
      | `AUTO_CALLOUT
      | `CASELESS
      | `DOLLAR_ENDONLY
      | `DOTALL
      | `EXTENDED
      | `EXTRA
      | `FIRSTLINE
      | `MULTILINE
      | `NO_AUTO_CAPTURE
      | `NO_UTF8_CHECK
      | `UNGREEDY
      | `UTF8 ]
  val cflags : Pcre.cflag list -> Pcre.icflag
  val cflag_list : Pcre.icflag -> Pcre.cflag list
  type rflag = [ `ANCHORED | `NOTBOL | `NOTEMPTY | `NOTEOL | `PARTIAL ]
  val rflags : Pcre.rflag list -> Pcre.irflag
  val rflag_list : Pcre.irflag -> Pcre.rflag list
  val version : string
  val config_utf8 : bool
  val config_newline : char
  val config_link_size : int
  val config_match_limit : int
  val config_match_limit_recursion : int
  val config_stackrecurse : bool
  type firstbyte_info = [ `ANCHORED | `Char of char | `Start_only ]
  type study_stat = [ `Not_studied | `Optimal | `Studied ]
  type regexp
  external options : Pcre.regexp -> Pcre.icflag = "pcre_options_stub"
  external size : Pcre.regexp -> int = "pcre_size_stub"
  external studysize : Pcre.regexp -> int = "pcre_studysize_stub"
  external capturecount : Pcre.regexp -> int = "pcre_capturecount_stub"
  external backrefmax : Pcre.regexp -> int = "pcre_backrefmax_stub"
  external namecount : Pcre.regexp -> int = "pcre_namecount_stub"
  external names : Pcre.regexp -> string array = "pcre_names_stub"
  external nameentrysize : Pcre.regexp -> int = "pcre_nameentrysize_stub"
  external firstbyte : Pcre.regexp -> Pcre.firstbyte_info
    = "pcre_firstbyte_stub"
  external firsttable : Pcre.regexp -> string option = "pcre_firsttable_stub"
  external lastliteral : Pcre.regexp -> char option = "pcre_lastliteral_stub"
  external study_stat : Pcre.regexp -> Pcre.study_stat
    = "pcre_study_stat_stub" "noalloc"
  val get_stringnumber : Pcre.regexp -> string -> int
  external get_match_limit : Pcre.regexp -> int option
    = "pcre_get_match_limit_stub"
  external get_match_limit_recursion : Pcre.regexp -> int option
    = "pcre_get_match_limit_recursion_stub"
  type chtables
  external maketables : unit -> Pcre.chtables = "pcre_maketables_stub"
  val regexp :
    ?study:bool ->
    ?limit:int ->
    ?limit_recursion:int ->
    ?iflags:Pcre.icflag ->
    ?flags:Pcre.cflag list ->
    ?chtables:Pcre.chtables -> string -> Pcre.regexp
  val regexp_or :
    ?study:bool ->
    ?limit:int ->
    ?limit_recursion:int ->
    ?iflags:Pcre.icflag ->
    ?flags:Pcre.cflag list ->
    ?chtables:Pcre.chtables -> string list -> Pcre.regexp
  val quote : string -> string
  type substrings
  val get_subject : Pcre.substrings -> string
  val num_of_subs : Pcre.substrings -> int
  val get_substring : Pcre.substrings -> int -> string
  val get_substring_ofs : Pcre.substrings -> int -> int * int
  val get_substrings : ?full_match:bool -> Pcre.substrings -> string array
  val get_opt_substrings :
    ?full_match:bool -> Pcre.substrings -> string option array
  val get_named_substring :
    Pcre.regexp -> string -> Pcre.substrings -> string
  val get_named_substring_ofs :
    Pcre.regexp -> string -> Pcre.substrings -> int * int
  type callout_data = {
    callout_number : int;
    substrings : Pcre.substrings;
    start_match : int;
    current_position : int;
    capture_top : int;
    capture_last : int;
    pattern_position : int;
    next_item_length : int;
  }
  type callout = Pcre.callout_data -> unit
  val pcre_exec :
    ?iflags:Pcre.irflag ->
    ?flags:Pcre.rflag list ->
    ?rex:Pcre.regexp ->
    ?pat:string -> ?pos:int -> ?callout:Pcre.callout -> string -> int array
  val exec :
    ?iflags:Pcre.irflag ->
    ?flags:Pcre.rflag list ->
    ?rex:Pcre.regexp ->
    ?pat:string ->
    ?pos:int -> ?callout:Pcre.callout -> string -> Pcre.substrings
  val exec_all :
    ?iflags:Pcre.irflag ->
    ?flags:Pcre.rflag list ->
    ?rex:Pcre.regexp ->
    ?pat:string ->
    ?pos:int -> ?callout:Pcre.callout -> string -> Pcre.substrings array
  val next_match :
    ?iflags:Pcre.irflag ->
    ?flags:Pcre.rflag list ->
    ?rex:Pcre.regexp ->
    ?pat:string ->
    ?pos:int -> ?callout:Pcre.callout -> Pcre.substrings -> Pcre.substrings
  val extract :
    ?iflags:Pcre.irflag ->
    ?flags:Pcre.rflag list ->
    ?rex:Pcre.regexp ->
    ?pat:string ->
    ?pos:int ->
    ?full_match:bool -> ?callout:Pcre.callout -> string -> string array
  val extract_opt :
    ?iflags:Pcre.irflag ->
    ?flags:Pcre.rflag list ->
    ?rex:Pcre.regexp ->
    ?pat:string ->
    ?pos:int ->
    ?full_match:bool ->
    ?callout:Pcre.callout -> string -> string option array
  val extract_all :
    ?iflags:Pcre.irflag ->
    ?flags:Pcre.rflag list ->
    ?rex:Pcre.regexp ->
    ?pat:string ->
    ?pos:int ->
    ?full_match:bool -> ?callout:Pcre.callout -> string -> string array array
  val extract_all_opt :
    ?iflags:Pcre.irflag ->
    ?flags:Pcre.rflag list ->
    ?rex:Pcre.regexp ->
    ?pat:string ->
    ?pos:int ->
    ?full_match:bool ->
    ?callout:Pcre.callout -> string -> string option array array
  val pmatch :
    ?iflags:Pcre.irflag ->
    ?flags:Pcre.rflag list ->
    ?rex:Pcre.regexp ->
    ?pat:string -> ?pos:int -> ?callout:Pcre.callout -> string -> bool
  type substitution
  val subst : string -> Pcre.substitution
  val replace :
    ?iflags:Pcre.irflag ->
    ?flags:Pcre.rflag list ->
    ?rex:Pcre.regexp ->
    ?pat:string ->
    ?pos:int ->
    ?itempl:Pcre.substitution ->
    ?templ:string -> ?callout:Pcre.callout -> string -> string
  val qreplace :
    ?iflags:Pcre.irflag ->
    ?flags:Pcre.rflag list ->
    ?rex:Pcre.regexp ->
    ?pat:string ->
    ?pos:int -> ?templ:string -> ?callout:Pcre.callout -> string -> string
  val substitute_substrings :
    ?iflags:Pcre.irflag ->
    ?flags:Pcre.rflag list ->
    ?rex:Pcre.regexp ->
    ?pat:string ->
    ?pos:int ->
    ?callout:Pcre.callout ->
    subst:(Pcre.substrings -> string) -> string -> string
  val substitute :
    ?iflags:Pcre.irflag ->
    ?flags:Pcre.rflag list ->
    ?rex:Pcre.regexp ->
    ?pat:string ->
    ?pos:int ->
    ?callout:Pcre.callout -> subst:(string -> string) -> string -> string
  val replace_first :
    ?iflags:Pcre.irflag ->
    ?flags:Pcre.rflag list ->
    ?rex:Pcre.regexp ->
    ?pat:string ->
    ?pos:int ->
    ?itempl:Pcre.substitution ->
    ?templ:string -> ?callout:Pcre.callout -> string -> string
  val qreplace_first :
    ?iflags:Pcre.irflag ->
    ?flags:Pcre.rflag list ->
    ?rex:Pcre.regexp ->
    ?pat:string ->
    ?pos:int -> ?templ:string -> ?callout:Pcre.callout -> string -> string
  val substitute_substrings_first :
    ?iflags:Pcre.irflag ->
    ?flags:Pcre.rflag list ->
    ?rex:Pcre.regexp ->
    ?pat:string ->
    ?pos:int ->
    ?callout:Pcre.callout ->
    subst:(Pcre.substrings -> string) -> string -> string
  val substitute_first :
    ?iflags:Pcre.irflag ->
    ?flags:Pcre.rflag list ->
    ?rex:Pcre.regexp ->
    ?pat:string ->
    ?pos:int ->
    ?callout:Pcre.callout -> subst:(string -> string) -> string -> string
  val split :
    ?iflags:Pcre.irflag ->
    ?flags:Pcre.rflag list ->
    ?rex:Pcre.regexp ->
    ?pat:string ->
    ?pos:int -> ?max:int -> ?callout:Pcre.callout -> string -> string list
  val asplit :
    ?iflags:Pcre.irflag ->
    ?flags:Pcre.rflag list ->
    ?rex:Pcre.regexp ->
    ?pat:string ->
    ?pos:int -> ?max:int -> ?callout:Pcre.callout -> string -> string array
  type split_result =
      Text of string
    | Delim of string
    | Group of int * string
    | NoGroup
  val full_split :
    ?iflags:Pcre.irflag ->
    ?flags:Pcre.rflag list ->
    ?rex:Pcre.regexp ->
    ?pat:string ->
    ?pos:int ->
    ?max:int -> ?callout:Pcre.callout -> string -> Pcre.split_result list
  val foreach_line : ?ic:Pervasives.in_channel -> (string -> unit) -> unit
  val foreach_file :
    string list -> (string -> Pervasives.in_channel -> unit) -> unit
  external unsafe_pcre_exec :
    Pcre.irflag ->
    Pcre.regexp ->
    int -> string -> int -> int array -> Pcre.callout option -> unit
    = "pcre_exec_stub_bc" "pcre_exec_stub"
  val make_ovector : Pcre.regexp -> int * int array
end