From 8f0260c89e45f9a5b36fedb9488ef56095c4f6fe Mon Sep 17 00:00:00 2001
From: Andre Maroneze <andre.maroneze@cea.fr>
Date: Wed, 22 Jul 2020 14:19:19 +0200
Subject: [PATCH] [Extlib] add function format_string_of_stag

---
 src/libraries/stdlib/extlib.ml      |  4 ++++
 src/libraries/stdlib/extlib.mli     |  7 +++++++
 src/plugins/gui/pretty_source.ml    | 10 ++--------
 src/plugins/gui/wtext.ml            |  5 +----
 src/plugins/metrics/metrics_base.ml | 10 ++--------
 src/plugins/server/jbuffer.ml       |  5 +----
 6 files changed, 17 insertions(+), 24 deletions(-)

diff --git a/src/libraries/stdlib/extlib.ml b/src/libraries/stdlib/extlib.ml
index 0714b72b4c9..04d1facd71e 100644
--- a/src/libraries/stdlib/extlib.ml
+++ b/src/libraries/stdlib/extlib.ml
@@ -512,6 +512,10 @@ let html_escape s =
     ) s ;
   Buffer.contents buf
 
+let format_string_of_stag = function
+  | Format.String_tag tag -> tag
+  | _ -> raise (Invalid_argument "unsupported tag extension")
+
 (* ************************************************************************* *)
 (** Comparison functions *)
 (* ************************************************************************* *)
diff --git a/src/libraries/stdlib/extlib.mli b/src/libraries/stdlib/extlib.mli
index a4ddfca43aa..7a1204e843c 100644
--- a/src/libraries/stdlib/extlib.mli
+++ b/src/libraries/stdlib/extlib.mli
@@ -320,6 +320,13 @@ val strip_underscore: string -> string
 
 val html_escape: string -> string
 
+(** [format_string_of_stag stag] returns the string corresponding to [stag],
+    or raises an exception if the tag extension is unsupported.
+
+    @since Frama-C+dev
+ *)
+val format_string_of_stag: Format.stag -> string
+
 (* ************************************************************************* *)
 (** {2 Performance} *)
 (* ************************************************************************* *)
diff --git a/src/plugins/gui/pretty_source.ml b/src/plugins/gui/pretty_source.ml
index d86d8befd03..fae7a1f6c75 100644
--- a/src/plugins/gui/pretty_source.ml
+++ b/src/plugins/gui/pretty_source.ml
@@ -275,20 +275,14 @@ let localizable_from_locs state ~file ~line =
 let buffer_formatter state source =
   let starts = Stack.create () in
   let emit_open_tag s =
-    let s = match s with
-      | Format.String_tag tag -> tag
-      | _ -> raise (Invalid_argument "unsupported tag extension")
-    in
+    let s = Extlib.format_string_of_stag s in
     (* Ignore tags that are not ours *)
     if Extlib.string_prefix "guitag:" s then
       Stack.push (source#end_iter#offset, Tag.get s) starts ;
     ""
   in
   let emit_close_tag s =
-    let s = match s with
-      | Format.String_tag tag -> tag
-      | _ -> raise (Invalid_argument "unsupported tag extension")
-    in
+    let s = Extlib.format_string_of_stag s in
     (try
        if Extlib.string_prefix "guitag:" s then
          let (p,sid) = Stack.pop starts in
diff --git a/src/plugins/gui/wtext.ml b/src/plugins/gui/wtext.ml
index f8252175c62..7bfe557c975 100644
--- a/src/plugins/gui/wtext.ml
+++ b/src/plugins/gui/wtext.ml
@@ -244,10 +244,7 @@ class text ?(autoscroll=false) ?(width=80) ?(indent=60) () =
         end
 
     method private open_tag name =
-      let name = match name with
-        | Format.String_tag str -> str
-        | _ -> raise (Invalid_argument "unsupported tag extension")
-      in
+      let name = Extlib.format_string_of_stag name in
       self#flush () ; style <- self#tag name :: style ; ""
 
     method private close_tag _name =
diff --git a/src/plugins/metrics/metrics_base.ml b/src/plugins/metrics/metrics_base.ml
index b847b1b185d..c4c0934db60 100644
--- a/src/plugins/metrics/metrics_base.ml
+++ b/src/plugins/metrics/metrics_base.ml
@@ -26,16 +26,10 @@ open Cil_types (* vname, vaddrof *)
 (* Formatting html with Format.formatters *)
 let html_stag_functions =
   let mark_open_stag t =
-    let t = match t with
-      | Format.String_tag tag -> tag
-      | _ -> raise (Invalid_argument "unsupported tag extension")
-    in
+    let t = Extlib.format_string_of_stag t in
     Format.sprintf "<%s>" t
   and mark_close_stag t =
-    let t = match t with
-      | Format.String_tag tag -> tag
-      | _ -> raise (Invalid_argument "unsupported tag extension")
-    in
+    let t = Extlib.format_string_of_stag t in
     try
       let index = String.index t ' ' in
       Format.sprintf "</%s>" (String.sub t 0 index)
diff --git a/src/plugins/server/jbuffer.ml b/src/plugins/server/jbuffer.ml
index ced67a4aa78..f7ca9ebbfe0 100644
--- a/src/plugins/server/jbuffer.ml
+++ b/src/plugins/server/jbuffer.ml
@@ -41,10 +41,7 @@ let flush buffer () =
     Buffer.clear t
 
 let push_tag buffer stag =
-  let tag = match stag with
-    | Format.String_tag tag -> tag
-    | _ -> raise (Invalid_argument "unsupported tag extension")
-  in
+  let tag = Extlib.format_string_of_stag stag in
   flush buffer () ;
   buffer.stack <- ( tag , buffer.rjson ) :: buffer.stack ;
   buffer.rjson <- []
-- 
GitLab