Abfrage gueltiger Consumers hinzugefuegt.

Mittels HHasConsumers() kann nun abgefragt werden, wie viele
gueltige Konsumenten ein (oder mehrere) Hooks haben.
Kann z.B. im clean_up() genutzt werden um zu entscheiden,
ob jemand auf den Hookprovider angewiesen ist.
Intern laeuft in HHasConsumers() ein CleanHookMapping(), d.h.
als Seiteneffekt wird die interne Datenstruktur aufgeraeumt
und von kaputten/abgelaufenen Eintraegen befreit.

Change-Id: I34cbb83fb42541f209c0ff271728e099cd60a699
diff --git a/std/hook_provider.c b/std/hook_provider.c
index 00b8ca3..321ea8a 100644
--- a/std/hook_provider.c
+++ b/std/hook_provider.c
@@ -43,7 +43,7 @@
 */
 private nosave mapping hookMapping=([]);
 
-protected void CleanHookMapping(int *hookids);
+protected int CleanHookMapping(int *hookids);
 
 // Debugging - ggf. ueberschreiben
 protected int h_dbg() {return 0;}
@@ -86,12 +86,16 @@
 }
 
 // clean internal hook data structures of stale hook consumers.
-protected void CleanHookMapping(int *hookids){
+// returns the number of valid consumers left.
+protected int CleanHookMapping(int *hookids)
+{
   // hooks enthaelt die aufzuraeumenden Hooks. Wenn kein Array -> alle Hooks
   if (!pointerp(hookids))
     hookids=m_indices(hookMapping);
 
-  foreach(int hookid : hookids) { // alle Hooks
+  int count;
+  foreach(int hookid : hookids)
+  { // alle Hooks
     struct hook_s hooks = hookMapping[hookid];
     if (!structp(hooks))
       continue;
@@ -101,16 +105,29 @@
       // Yeah - compute struct lookup at runtime... ;-)
       struct hook_entry_s *consumers = hooks->(consumertype);
       // Hookeintraege / Consumer
-      foreach(struct hook_entry_s h : &consumers) {
+      foreach(struct hook_entry_s h : &consumers)
+      {
         // alle abgelaufenen Eintraege oder solche mit zerstoerten Objekten
-        // nullen
+        // nullen und die anderen/gueltigen zaehlen.
         if (!h->cl || h->endtime < time() )
             h = 0;
+        else
+            ++count;
       }
       // 0 noch rauswerfen.
       hooks->(consumertype) -= ({0});
     }
   }
+  return count;
+}
+
+// Returns the number of valid consumers for the given hooks (or all, if
+// hooks==0).
+// Side effect: Cleans the internal structures and removes any stale
+// consumers.
+public varargs int HHasConsumers(int *hookids)
+{
+  return CleanHookMapping(hookids);
 }
 
 protected void offerHook(int hookid, int offerstate)