Commit c0663561b19931f7cc7c17d3ad01e007b470f276

Thomas de Grivel 2023-02-11T11:40:07

wip

diff --git a/libc3/buf_parse.c b/libc3/buf_parse.c
index 2378d77..80d5a97 100644
--- a/libc3/buf_parse.c
+++ b/libc3/buf_parse.c
@@ -469,7 +469,9 @@ sw buf_parse_fn_algo (s_buf *buf, s_list **dest)
   sw r;
   sw result = 0;
   s_buf_save save;
+  s_list **t;
   s_tag tag;
+  s_list *tmp = NULL;
   assert(buf);
   assert(dest);
   buf_save_init(buf, &save);
@@ -479,12 +481,17 @@ sw buf_parse_fn_algo (s_buf *buf, s_list **dest)
   if ((r = buf_ignore_spaces(buf)) < 0)
     goto restore;
   result += r;
-  while ((r = buf_parse_tag(buf, &tag)) > 0) {
+  t = &tmp;
+  while (1) {
+    if ((r = buf_parse_tag(buf, &tag)) < 0)
+      goto restore;
+    if (! r)
+      break;
     result += r;
-    *dest = list_new(NULL);
-    (*dest)->tag = tag;
-    tag_init_list(&(*dest)->next, NULL);
-    dest = &(*dest)->next.data.list;
+    *t = list_new(NULL);
+    (*t)->tag = tag;
+    tag_init_list(&(*t)->next, NULL);
+    t = &(*t)->next.data.list;
     if ((r = buf_ignore_spaces(buf)) < 0)
       goto restore;
     result += r;
@@ -497,11 +504,10 @@ sw buf_parse_fn_algo (s_buf *buf, s_list **dest)
       goto restore;
     result += r;
   }
-  if (r < 0)
-    goto restore;
   if ((r = buf_read_1(buf, "}")) <= 0)
     goto restore;
   result += r;
+  *dest = tmp;
   r = result;
   goto clean;
  restore:
@@ -516,7 +522,9 @@ sw buf_parse_fn_pattern (s_buf *buf, s_list **dest)
   sw r;
   sw result = 0;
   s_buf_save save;
+  s_list **t;
   s_tag tag;
+  s_list *tmp = NULL;
   assert(buf);
   assert(dest);
   buf_save_init(buf, &save);
@@ -526,13 +534,14 @@ sw buf_parse_fn_pattern (s_buf *buf, s_list **dest)
   if ((r = buf_ignore_spaces(buf)) < 0)
     goto restore;
   result += r;
+  t = &tmp;
   while (1) {
     if ((r = buf_parse_tag(buf, &tag)) <= 0)
       goto restore;
     result += r;
-    *dest = list_new(NULL);
-    (*dest)->tag = tag;
-    dest = &(*dest)->next.data.list;
+    *t = list_new(NULL);
+    (*t)->tag = tag;
+    t = &(*t)->next.data.list;
     if ((r = buf_ignore_spaces(buf)) < 0)
       goto restore;
     result += r;
@@ -549,10 +558,12 @@ sw buf_parse_fn_pattern (s_buf *buf, s_list **dest)
       goto restore;
     result += r;
   }
+  *dest = tmp;
   r = result;
   goto clean;
  restore:
   buf_save_restore_rpos(buf, &save);
+  list_delete_all(tmp);
  clean:
   buf_save_clean(buf, &save);
   return r;