Commit 931608d22765d086f184ba1b79c1b700057a94c3

Thomas de Grivel 2025-04-18T21:33:01

buf_inspect_str_character_size

diff --git a/libkc3/buf_inspect.c b/libkc3/buf_inspect.c
index 4d0ba80..e75efd6 100644
--- a/libkc3/buf_inspect.c
+++ b/libkc3/buf_inspect.c
@@ -3286,30 +3286,77 @@ sw buf_inspect_str_character (s_buf *buf, const character *c)
 
 sw buf_inspect_str_character_size (s_pretty *pretty, const character *c)
 {
-  sw csize;
-  sw size;
-  (void) pretty;
+  char b[4];
+  s_buf char_buf;
+  int i;
+  sw r;
+  sw result = 0;
+  sw result1 = 0;
   if (! str_character_is_reserved(*c))
-    return character_utf8_size(*c);
-  size = 0;
+    return buf_write_character_utf8_size(pretty, *c);
+  if ((r = buf_write_1_size(pretty, "\\")) <= 0)
+    goto restore;
+  result += r;
   switch (*c) {
   case '\0':
+    if ((r = buf_write_character_utf8_size(pretty, '0')) <= 0)
+      goto restore;
+    break;
   case '\n':
+    if ((r = buf_write_character_utf8_size(pretty, 'n')) <= 0)
+      goto restore;
+    break;
   case '\r':
+    if ((r = buf_write_character_utf8_size(pretty, 'r')) <= 0)
+      goto restore;
+    break;
   case '\t':
+    if ((r = buf_write_character_utf8_size(pretty, 't')) <= 0)
+      goto restore;
+    break;
   case '\v':
+    if ((r = buf_write_character_utf8_size(pretty, 'v')) <= 0)
+      goto restore;
+    break;
   case '\"':
+    if ((r = buf_write_character_utf8_size(pretty, '"')) <= 0)
+      goto restore;
+    break;
   case '\'':
+    if ((r = buf_write_character_utf8_size(pretty, '\'')) <= 0)
+      goto restore;
+    break;
   case '\\':
-    size += 2;
+    if ((r = buf_write_character_utf8_size(pretty, '\\')) <= 0)
+      goto restore;
     break;
   default:
-    csize = character_utf8_size(*c);
-    if (csize <= 0)
-      return -1;
-    size += csize * 4;
+    buf_init(&char_buf, false, sizeof(b), b);
+    if ((r = buf_write_character_utf8(&char_buf, *c)) <= 0)
+      goto restore;
+    i = r - 1;
+    if ((r = buf_write_character_utf8_size(pretty, 'x')) != 1)
+      goto restore;
+    result1 += r;
+    r = 2;
+    result1 += r;
+    while (i--) {
+      if ((r = buf_write_1_size(pretty, "\\x")) != 2)
+        goto restore;
+      result1 += r;
+      r = 2;
+      result1 += r;
+    }
+    r = result1;
   }
-  return size;
+  result += r;
+  r = result;
+  goto clean;
+ restore:
+  if (r >= 0)
+    r = -1;
+ clean:
+  return r;
 }
 
 sw buf_inspect_str_eval (s_buf *buf, const s_list *list)