Browse Source

Restore the color part of Core_extended

 - The file has been copied from the repository of core_extended. It leaves
   unmodified. A symlink grab in inside src directory, for convenience.
 - The right library (Re2) has been added to be able to compile it. As a result,
   _oasis file was modified and some oasis generated files were modified too.
 - Code using the color_print's functions has not yet been restored, maybe in
   upcoming commits.
 - To comply with legal requirement, this was done a separate directory, to keep
   it aside. Legal mentions have been reproduced, to the extend I could find it,
   since there is no header in the color_print file. No NOTICE file was found,
   other legally significant files were reproduced. Any comments on the legal
   part of this work is welcome. If I missed something, I would do my possible
   to correct it.
 - As you see it, from the two solution listed in commit
   46a45235f2bf9a72c774626beccf9f71ad1f8291, the ugly copy-pasting-based one was
   chosen.
Leo 9 years ago
parent
commit
dc38476717

+ 2 - 1
INSTALL.md

@@ -1,5 +1,5 @@
 <!--- OASIS_START --->
-<!--- DO NOT EDIT (digest: caa10816c3c9689f846b03a0fa379434) --->
+<!--- DO NOT EDIT (digest: e39b2a56b1c8d15b002c554e90d54359) --->
 
 This is the INSTALL file for the OcLaunch distribution.
 
@@ -16,6 +16,7 @@ In order to compile this package, you will need:
 * core
 * textutils
 * atdgen
+* re2 for executable oclaunch
 * alcotest for executable run_test
 * oUnit for executable run_test
 

+ 1 - 1
_oasis

@@ -28,7 +28,7 @@ PreBuildCommand: echo "Atdgen executed"
 Executable oclaunch
   Path:       src
   MainIs:     oclaunch.ml
-  BuildDepends: core, textutils, atdgen, threads
+  BuildDepends: core, textutils, atdgen, threads, re2
   CompiledObject: best
 
 Executable "run_test"

+ 3 - 1
_tags

@@ -1,5 +1,5 @@
 # OASIS_START
-# DO NOT EDIT (digest: e9ef8e895a62f6d302c93293b9e2d7af)
+# DO NOT EDIT (digest: e83e83ffeca91f64ced159dafe6e0f0c)
 # Ignore VCS directories, you can use the same kind of rule outside
 # OASIS_START/STOP if you want to exclude directories that contains
 # useless stuff for the build process
@@ -17,8 +17,10 @@ true: annot, bin_annot
 # Executable oclaunch
 <src/oclaunch.{native,byte}>: pkg_atdgen
 <src/oclaunch.{native,byte}>: pkg_core
+<src/oclaunch.{native,byte}>: pkg_re2
 <src/oclaunch.{native,byte}>: pkg_textutils
 <src/oclaunch.{native,byte}>: pkg_threads
+<src/*.ml{,i,y}>: pkg_re2
 # Executable run_test
 <src/test/test.{native,byte}>: pkg_alcotest
 <src/test/test.{native,byte}>: pkg_atdgen

+ 5 - 4
setup.ml

@@ -1,7 +1,7 @@
 (* setup.ml generated for the first time by OASIS v0.4.5 *)
 
 (* OASIS_START *)
-(* DO NOT EDIT (digest: 295e7c9a49c18130f10cb53d140e828c) *)
+(* DO NOT EDIT (digest: d38b858b26a1b0dd05019e4fd2b8fb85) *)
 (*
    Regenerated by OASIS v0.4.5
    Visit http://oasis.forge.ocamlcore.org for more information and
@@ -6929,7 +6929,8 @@ let setup_t =
                            FindlibPackage ("core", None);
                            FindlibPackage ("textutils", None);
                            FindlibPackage ("atdgen", None);
-                           FindlibPackage ("threads", None)
+                           FindlibPackage ("threads", None);
+                           FindlibPackage ("re2", None)
                         ];
                       bs_build_tools =
                         [ExternalTool "ocamlbuild"; ExternalTool "camlp4o"];
@@ -7019,7 +7020,7 @@ let setup_t =
        };
      oasis_fn = Some "_oasis";
      oasis_version = "0.4.5";
-     oasis_digest = Some "\193L\223w\146K\213\144r\003%\242A\214\131>";
+     oasis_digest = Some "u\r\025\169\007W:\153kP?@\014\160\025K";
      oasis_exec = None;
      oasis_setup_args = [];
      setup_update = false
@@ -7027,6 +7028,6 @@ let setup_t =
 
 let setup () = BaseSetup.setup setup_t;;
 
-# 7031 "setup.ml"
+# 7032 "setup.ml"
 (* OASIS_STOP *)
 let () = setup ();;

+ 1 - 0
src/color_print.ml

@@ -0,0 +1 @@
+third-part/core_extended/color_print.ml

+ 2 - 1
src/messages.ml

@@ -1,5 +1,5 @@
 (******************************************************************************)
-(* Copyright © Joly Clément, 2014-2015                                        *)
+(* Copyright © Joly Clément, 2014-2015-2016                                   *)
 (*                                                                            *)
 (*  leowzukw@vmail.me                                                         *)
 (*                                                                            *)
@@ -162,5 +162,6 @@ let tips message =
 
 (* Reset printing, to avoid color problem on some terminal (Konsole), the  *)
 let reset () =
+  let open Color_print in
   failwith "Not implemented"
 ;;

+ 13 - 0
src/third-part/core_extended/INRIA-DISCLAIMER.txt

@@ -0,0 +1,13 @@
+THIS SOFTWARE IS PROVIDED BY INRIA AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INRIA OR ITS CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+

+ 203 - 0
src/third-part/core_extended/LICENSE.txt

@@ -0,0 +1,203 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+

+ 15 - 0
src/third-part/core_extended/README

@@ -0,0 +1,15 @@
+Files in this directory are based on the file with the same name of the
+Core_extended library, published under Apache-2.0 as follow:
+
+(C) 2008-2016 Jane Street Group LLC <opensource@janestreet.com>
+Apache-2.0
+
+You may find a copy of the Apache licence in the LICENSE.txt file in this
+folder. The THIRD-PARTY.txt, LICENSE.txt (in this folder) and
+INRIA-DISCLAIMER.txt have been reproduced as they were in commit
+987a5b7994104e6cb41867bb4775ac970fb64830.
+
+The file color_print.ml is as it was in commit
+7351d453b3a7a8d2c77fdff817f19ebf1df1400d. It is symbolic linked in src/ folder,
+for convenience.
+

+ 19 - 0
src/third-part/core_extended/THIRD-PARTY.txt

@@ -0,0 +1,19 @@
+The repository contains 3rd-party code in the following locations and
+under the following licenses:
+
+- type_conv, sexplib and bin_prot: based on Tywith, by Martin
+  Sandin.  License can be found in base/sexplib/LICENSE-Tywith.txt,
+  base/type_conv/LICENSE-Tywith.txt, and base/bin_prot/LICENSE-Tywith.txt.
+
+- Core's implementation of union-find: based on an implementation by
+  Henry Matthew Fluet, Suresh Jagannathan, and Stephen Weeks. License
+  can be found in base/core/MLton-license.
+
+- Various Core libraries are based on INRIA's OCaml
+  distribution. Relicensed under Apache 2.0, as permitted under the
+  Caml License for Consortium members:
+
+     http://caml.inria.fr/consortium/license.en.html
+
+  See also the disclaimer INRIA-DISCLAIMER.txt.
+

+ 135 - 0
src/third-part/core_extended/color_print.ml

@@ -0,0 +1,135 @@
+open Core.Std
+
+let ansi_regexp = Memo.unit (fun () -> Re2.Std.Re2.create_exn "\027\\[.*?m")
+
+let ansi_capture_regexp = Memo.unit (fun () -> Re2.Std.Re2.create_exn "(\027\\[.*?m)")
+let normal_capture_regexp = Memo.unit (fun () -> Re2.Std.Re2.create_exn "(\027\\[0m)")
+
+let normal str =
+  Re2.Std.Re2.rewrite_exn (ansi_regexp ()) ~template:"" str
+
+let add_after_ansi str ~code =
+  Re2.Std.Re2.rewrite_exn (ansi_capture_regexp ()) ~template:("\\1" ^ code) str
+let add_after_normal str ~code =
+  Re2.Std.Re2.rewrite_exn (normal_capture_regexp ()) ~template:("\\1" ^ code) str
+
+let ansi_code ~code = "\027[" ^ code ^ "m"
+
+let normal_code    = ansi_code ~code:"0"
+let bold_code      = ansi_code ~code:"1"
+let underline_code = ansi_code ~code:"4"
+let red_code       = ansi_code ~code:"31"
+let green_code     = ansi_code ~code:"32"
+let yellow_code    = ansi_code ~code:"33"
+let blue_code      = ansi_code ~code:"34"
+let magenta_code   = ansi_code ~code:"35"
+let cyan_code      = ansi_code ~code:"36"
+let inverse_code   = ansi_code ~code:"7"
+
+let float_to_int x ~max =
+    if x <= 0. then 0
+    else if x >= 1. then max
+    else Float.iround_exn ~dir:`Nearest (x *. Float.of_int max)
+
+let gray_code ~brightness =
+  let brightness = float_to_int brightness ~max:23 in
+  ansi_code ~code:("38;5;" ^ Int.to_string (brightness + 232))
+let rgbint_code ~r ~g ~b =
+  ansi_code ~code:("38;5;" ^ Int.to_string (16 + r*36 + g*6 + b))
+let rgb_code ~r ~g ~b =
+  let r = float_to_int r ~max:5 in
+  let g = float_to_int g ~max:5 in
+  let b = float_to_int b ~max:5 in
+  rgbint_code ~r ~g ~b
+
+type color = [
+| `Black | `Gray | `Light_gray | `White
+| `Dark_red | `Red | `Pink | `Light_pink
+| `Orange | `Amber
+| `Dark_yellow | `Gold | `Yellow | `Khaki | `Wheat
+| `Chartreuse | `Green_yellow
+| `Dark_green | `Green | `Light_green | `Bright_green
+| `Spring_green | `Medium_spring_green
+| `Dark_cyan | `Sea_green | `Cyan | `Turquoise | `Pale_turquoise
+| `Dodger_blue | `Deep_sky_blue
+| `Dark_blue | `Blue | `Light_slate_blue | `Light_steel_blue
+| `Blue_violet | `Violet
+| `Dark_magenta | `Purple | `Magenta | `Orchid | `Plum
+| `Rose | `Deep_pink
+] [@@deriving sexp, bin_io]
+
+let color_code ~(color:color) =
+  let (r,g,b) =
+    match (color:color) with
+    | `Black -> (0,0,0) | `Gray -> (2,2,2) | `Light_gray -> (3,3,3) | `White -> (5,5,5)
+    | `Dark_red -> (2,0,0) | `Red -> (5,0,0) | `Pink -> (5,2,2) | `Light_pink -> (5,3,3)
+    | `Orange -> (5,2,0) | `Amber -> (5,3,0)
+    | `Dark_yellow -> (2,2,0) | `Gold -> (3,3,0) | `Yellow -> (5,5,0) | `Khaki -> (5,5,2) | `Wheat -> (5,5,3)
+    | `Chartreuse -> (2,5,0) | `Green_yellow -> (3,5,0)
+    | `Dark_green -> (0,2,0) | `Green -> (0,5,0) | `Light_green -> (2,5,2) | `Bright_green -> (3,5,3)
+    | `Spring_green -> (0,5,2) | `Medium_spring_green -> (0,5,3)
+    | `Dark_cyan -> (0,2,2) | `Sea_green -> (0,3,3) | `Cyan -> (0,5,5) | `Turquoise -> (2,5,5) | `Pale_turquoise -> (3,5,5)
+    | `Dodger_blue -> (0,2,5) | `Deep_sky_blue -> (0,3,5)
+    | `Dark_blue -> (0,0,2) | `Blue -> (0,0,5) | `Light_slate_blue -> (2,2,5) | `Light_steel_blue -> (3,3,5)
+    | `Blue_violet -> (2,0,5) | `Violet -> (3,0,5)
+    | `Dark_magenta -> (2,0,2) | `Purple -> (3,0,3) | `Magenta -> (5,0,5) | `Orchid -> (5,2,5) | `Plum -> (5,3,5)
+    | `Rose -> (5,0,2) | `Deep_pink -> (5,0,3)
+  in
+  rgbint_code ~r ~g ~b
+
+
+let wrap ?(override=false) str ~code =
+  code
+  ^ (if override
+     then add_after_ansi str ~code
+     else add_after_normal str ~code)
+  ^ normal_code
+
+let bold      ?override str = wrap ?override str ~code:bold_code
+let underline ?override str = wrap ?override str ~code:underline_code
+let red       ?override str = wrap ?override str ~code:red_code
+let green     ?override str = wrap ?override str ~code:green_code
+let yellow    ?override str = wrap ?override str ~code:yellow_code
+let blue      ?override str = wrap ?override str ~code:blue_code
+let magenta   ?override str = wrap ?override str ~code:magenta_code
+let cyan      ?override str = wrap ?override str ~code:cyan_code
+let inverse   ?override str = wrap ?override str ~code:inverse_code
+
+let gray  ?override str ~brightness = wrap ?override str ~code:(gray_code ~brightness)
+let rgb   ?override str ~r ~g ~b    = wrap ?override str ~code:(rgb_code ~r ~g ~b)
+let color ?override str ~color      = wrap ?override str ~code:(color_code ~color)
+
+let wrap_print ?override ~code fmt =
+  Printf.ksprintf (fun str -> print_string (wrap ?override str ~code)) fmt
+
+let bold_printf      ?override fmt = wrap_print ?override ~code:bold_code      fmt
+let underline_printf ?override fmt = wrap_print ?override ~code:underline_code fmt
+let inverse_printf   ?override fmt = wrap_print ?override ~code:inverse_code   fmt
+let red_printf       ?override fmt = wrap_print ?override ~code:red_code       fmt
+let yellow_printf    ?override fmt = wrap_print ?override ~code:yellow_code    fmt
+let green_printf     ?override fmt = wrap_print ?override ~code:green_code     fmt
+let blue_printf      ?override fmt = wrap_print ?override ~code:blue_code      fmt
+let magenta_printf   ?override fmt = wrap_print ?override ~code:magenta_code   fmt
+let cyan_printf      ?override fmt = wrap_print ?override ~code:cyan_code      fmt
+
+let gray_printf ?override ~brightness fmt = wrap_print ?override ~code:(gray_code ~brightness) fmt
+let rgb_printf ?override ~r ~g ~b     fmt = wrap_print ?override ~code:(rgb_code ~r ~g ~b)     fmt
+let color_printf ?override ~color     fmt = wrap_print ?override ~code:(color_code ~color)     fmt
+
+let wrap_sprint ?override ~code fmt =
+  Printf.ksprintf (fun str -> wrap ?override str ~code) fmt
+
+let bold_sprintf      ?override fmt = wrap_sprint ?override ~code:bold_code      fmt
+let underline_sprintf ?override fmt = wrap_sprint ?override ~code:underline_code fmt
+let inverse_sprintf   ?override fmt = wrap_sprint ?override ~code:inverse_code   fmt
+let red_sprintf       ?override fmt = wrap_sprint ?override ~code:red_code       fmt
+let yellow_sprintf    ?override fmt = wrap_sprint ?override ~code:yellow_code    fmt
+let green_sprintf     ?override fmt = wrap_sprint ?override ~code:green_code     fmt
+let blue_sprintf      ?override fmt = wrap_sprint ?override ~code:blue_code      fmt
+let magenta_sprintf   ?override fmt = wrap_sprint ?override ~code:magenta_code   fmt
+let cyan_sprintf      ?override fmt = wrap_sprint ?override ~code:cyan_code      fmt
+
+let gray_sprintf ?override ~brightness fmt = wrap_sprint ?override ~code:(gray_code ~brightness) fmt
+let rgb_sprintf ?override ~r ~g ~b     fmt = wrap_sprint ?override ~code:(rgb_code ~r ~g ~b)     fmt
+let color_sprintf ?override ~color     fmt = wrap_sprint ?override ~code:(color_code ~color)     fmt
+