Øyvind Harboe wrote:
> > double pointers are horrible.
> 
> Ah, missed that. Well another patch is gladly accepted, meanwhile
> it no longer crashes.

Fair. Two versions attached. One which makes the code two lines
longer and avoids double pointers, and a remix which uses only a
single double pointer and is net one line shorter.


//Peter
>From 2794909b0654630d71fe0fd618d7188a450234c4 Mon Sep 17 00:00:00 2001
From: Peter Stuge <[email protected]>
Date: Fri, 10 Dec 2010 08:19:23 +0100
Subject: [PATCH] jtag: Avoid double pointers when removing event callbacks

---
 src/jtag/core.c |   22 ++++++++++++----------
 1 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/src/jtag/core.c b/src/jtag/core.c
index dfedc17..dd6c8d0 100644
--- a/src/jtag/core.c
+++ b/src/jtag/core.c
@@ -296,24 +296,26 @@ int jtag_register_event_callback(jtag_event_handler_t 
callback, void *priv)
 
 int jtag_unregister_event_callback(jtag_event_handler_t callback, void *priv)
 {
-       struct jtag_event_callback **p = &jtag_event_callbacks, *temp;
+       struct jtag_event_callback *p, *prev, *next;
 
-       if (callback == NULL)
-       {
+       if (!callback)
                return ERROR_INVALID_ARGUMENTS;
-       }
 
-       while (*p)
+       for (p = jtag_event_callbacks, prev = NULL, p, p = next)
        {
-               if (((*p)->priv != priv) || ((*p)->callback != callback))
+               next = p->next;
+
+               if (p->callback != callback || p->priv != priv)
                {
-                       p = &(*p)->next;
+                       prev = p;
                        continue;
                }
 
-               temp = *p;
-               *p = (*p)->next;
-               free(temp);
+               if (prev)
+                       prev->next = next;
+               else
+                       jtag_event_callbacks = next;
+               free(p);
        }
 
        return ERROR_OK;
-- 
1.7.2

>From 1063bf4e9dcb722f39f015af47864b3583e6bdb1 Mon Sep 17 00:00:00 2001
From: Peter Stuge <[email protected]>
Date: Fri, 10 Dec 2010 08:19:23 +0100
Subject: [PATCH] jtag: Use only one double pointer when removing event callbacks

---
 src/jtag/core.c |   19 +++++++++----------
 1 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/src/jtag/core.c b/src/jtag/core.c
index dfedc17..6a97079 100644
--- a/src/jtag/core.c
+++ b/src/jtag/core.c
@@ -296,24 +296,23 @@ int jtag_register_event_callback(jtag_event_handler_t 
callback, void *priv)
 
 int jtag_unregister_event_callback(jtag_event_handler_t callback, void *priv)
 {
-       struct jtag_event_callback **p = &jtag_event_callbacks, *temp;
+       struct jtag_event_callback *p, *prev, *next;
 
-       if (callback == NULL)
-       {
+       if (!callback)
                return ERROR_INVALID_ARGUMENTS;
-       }
 
-       while (*p)
+       for (p = jtag_event_callbacks, prev = NULL, p, p = next)
        {
-               if (((*p)->priv != priv) || ((*p)->callback != callback))
+               next = p->next;
+
+               if (p->callback != callback || p->priv != priv)
                {
-                       p = &(*p)->next;
+                       prev = p;
                        continue;
                }
 
-               temp = *p;
-               *p = (*p)->next;
-               free(temp);
+               *(prev ? &prev->next : &jtag_event_callbacks) = next;
+               free(p);
        }
 
        return ERROR_OK;
-- 
1.7.2

_______________________________________________
Openocd-development mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to