match_living() & check_match() modernisiert + kommentiert

Die Funktionen brauchten mal dringend einige Kommentare und
ausserdem etwas Modernisierung im Codestyle.
Sollten keine Aenderung im Verhalten resultieren.

Change-Id: I345e603918c7b293073d27e0c98a760d13bdd199
diff --git a/secure/simul_efun/livings.c b/secure/simul_efun/livings.c
index d8cb7ad..b171794 100644
--- a/secure/simul_efun/livings.c
+++ b/secure/simul_efun/livings.c
@@ -239,19 +239,26 @@
   return res;
 }
 
-private int check_match( string str, int players_only )
+// Liefert 1 wenn es (mindestens) ein Living mit dem Namen lname gibt.
+private int check_match( string lname, int players_only )
 {
-    mixed match;
+    string|string* match;
 
-    if ( !(match = name_living_m[str]) )
+    // Livings (Objekte) fuer den Namen abfragen, ggf. mehrere
+    // Remark: nervig, dass da string|string* im Mapping steht...
+    if ( !(match = name_living_m[lname]) )
        return 0;
-
     if ( !pointerp(match) )
        match = ({ match });
 
+    // Und in der Liste koennten auch noch zerstoerte Objekt rumgammeln.
     match -= ({0});
 
-    if ( sizeof(match) ){
+    // Wenn was gefunden...
+    if ( sizeof(match) )
+    {
+       // ... ggf. noch einschraenken auf Spieler.
+       // BTW: kann max. 1 im Ergebnis sein, d.h. return 0 oder 1 hier.
        if ( players_only )
            return sizeof(filter( match, #'query_once_interactive/*'*/ ))
               > 0;
@@ -259,41 +266,48 @@
            return 1;
     }
 
-    m_delete( name_living_m, str );
-    clean_log( sprintf("check_match loescht %s\n", str) );
+    // Wenn kein Objekt unter dem Namen gefunden wurde, kann der ganze Eintrag
+    // fuer den Namen weg.
+    m_delete( name_living_m, lname );
+    clean_log( sprintf("check_match loescht %s\n", lname) );
     return 0;
 }
 
-//TODO:: string|string* exclude
-varargs mixed match_living( string str, int players_only, mixed exclude )
+// Liefert den genauen Namen des (existierenden) Livings (der mit lname
+// anfaengt) oder -1 wenn lname nicht eindeutig ist oder -2 wenn gar kein
+// Living zu finden ist, dessen Name mit lname beginnt.
+string|int match_living(string lname, int players_only=0,
+                        string|string* exclude=({}))
 {
-    int i, s;
-    mixed match, *user;
-
-    if ( !str || str == "" )
+    if ( !lname || lname == "" )
        return 0;
 
     if ( !pointerp(exclude) )
        exclude = ({ exclude });
 
-    if ( member(exclude, str) < 0 && check_match(str, players_only) )
-       return str;
+    // Wird etwas unter genau diesem Namen gefunden?
+    if ( !(lname in exclude) && check_match(lname, players_only) )
+       return lname;
 
-    user = m_indices(name_living_m);
-    s = sizeof(str);
-    match = 0;
+    // Wenn nicht, muessen alle Eintraege durchsucht werden. :-(
+    string match = 0;
 
-    for ( i = sizeof(user); i--; )
-       if ( str == user[i][0..s-1] && member( exclude, user[i] ) < 0 )
-           if ( match )
+    foreach(string candidate : name_living_m)
+    {
+       if ( strstr(candidate, lname) == 0 && !(candidate in exclude) )
+           if ( match ) // schonmal gefunden? -> mehr als ein match?
               return -1;
-           else
-              if ( check_match(user[i], players_only) )
-                  match = user[i];
-
+           else {
+              // Gibt es auch wirklich (noch) ein Objekt zu dem Namen?
+              if ( check_match(candidate, players_only) )
+                  match = candidate;
+           }
+    }
+    // ok, wirklich nix zu finden.
     if ( !match )
        return -2;
 
+    // Ansonsten den genauen Namen zurueckliefern.
     return match;
 }
 
diff --git a/secure/simul_efun/spare/livings.c b/secure/simul_efun/spare/livings.c
index d8cb7ad..b171794 100644
--- a/secure/simul_efun/spare/livings.c
+++ b/secure/simul_efun/spare/livings.c
@@ -239,19 +239,26 @@
   return res;
 }
 
-private int check_match( string str, int players_only )
+// Liefert 1 wenn es (mindestens) ein Living mit dem Namen lname gibt.
+private int check_match( string lname, int players_only )
 {
-    mixed match;
+    string|string* match;
 
-    if ( !(match = name_living_m[str]) )
+    // Livings (Objekte) fuer den Namen abfragen, ggf. mehrere
+    // Remark: nervig, dass da string|string* im Mapping steht...
+    if ( !(match = name_living_m[lname]) )
        return 0;
-
     if ( !pointerp(match) )
        match = ({ match });
 
+    // Und in der Liste koennten auch noch zerstoerte Objekt rumgammeln.
     match -= ({0});
 
-    if ( sizeof(match) ){
+    // Wenn was gefunden...
+    if ( sizeof(match) )
+    {
+       // ... ggf. noch einschraenken auf Spieler.
+       // BTW: kann max. 1 im Ergebnis sein, d.h. return 0 oder 1 hier.
        if ( players_only )
            return sizeof(filter( match, #'query_once_interactive/*'*/ ))
               > 0;
@@ -259,41 +266,48 @@
            return 1;
     }
 
-    m_delete( name_living_m, str );
-    clean_log( sprintf("check_match loescht %s\n", str) );
+    // Wenn kein Objekt unter dem Namen gefunden wurde, kann der ganze Eintrag
+    // fuer den Namen weg.
+    m_delete( name_living_m, lname );
+    clean_log( sprintf("check_match loescht %s\n", lname) );
     return 0;
 }
 
-//TODO:: string|string* exclude
-varargs mixed match_living( string str, int players_only, mixed exclude )
+// Liefert den genauen Namen des (existierenden) Livings (der mit lname
+// anfaengt) oder -1 wenn lname nicht eindeutig ist oder -2 wenn gar kein
+// Living zu finden ist, dessen Name mit lname beginnt.
+string|int match_living(string lname, int players_only=0,
+                        string|string* exclude=({}))
 {
-    int i, s;
-    mixed match, *user;
-
-    if ( !str || str == "" )
+    if ( !lname || lname == "" )
        return 0;
 
     if ( !pointerp(exclude) )
        exclude = ({ exclude });
 
-    if ( member(exclude, str) < 0 && check_match(str, players_only) )
-       return str;
+    // Wird etwas unter genau diesem Namen gefunden?
+    if ( !(lname in exclude) && check_match(lname, players_only) )
+       return lname;
 
-    user = m_indices(name_living_m);
-    s = sizeof(str);
-    match = 0;
+    // Wenn nicht, muessen alle Eintraege durchsucht werden. :-(
+    string match = 0;
 
-    for ( i = sizeof(user); i--; )
-       if ( str == user[i][0..s-1] && member( exclude, user[i] ) < 0 )
-           if ( match )
+    foreach(string candidate : name_living_m)
+    {
+       if ( strstr(candidate, lname) == 0 && !(candidate in exclude) )
+           if ( match ) // schonmal gefunden? -> mehr als ein match?
               return -1;
-           else
-              if ( check_match(user[i], players_only) )
-                  match = user[i];
-
+           else {
+              // Gibt es auch wirklich (noch) ein Objekt zu dem Namen?
+              if ( check_match(candidate, players_only) )
+                  match = candidate;
+           }
+    }
+    // ok, wirklich nix zu finden.
     if ( !match )
        return -2;
 
+    // Ansonsten den genauen Namen zurueckliefern.
     return match;
 }