fehlerloeschen nutzt get_issues()

Dadurch wird jetzt automatisch P_CURRENTDIR ausgewertet. Ausserdem
werden Code-Duplikate entfernt

Change-Id: Ie7e288a49d789ea0c3138f237b9775b766fca4ee
diff --git a/obj/tools/fehlerteufel.c b/obj/tools/fehlerteufel.c
index 5bb76f1..2e874e2 100644
--- a/obj/tools/fehlerteufel.c
+++ b/obj/tools/fehlerteufel.c
@@ -51,7 +51,7 @@
 private varargs int update_issuelist(int lmodus);
 private void get_uids();
 private struct fullissue_s get_issue(string arg);
-private struct fullissue_s|struct fullissue_s* get_issues(string arg);
+private struct fullissue_s|struct fullissue_s* get_issues(string arg, int parsed = 0);
 
 // irgendeinen Fehler oder Warnung anzeigen.
 private int show_entry(struct fullissue_s issue)
@@ -183,85 +183,79 @@
   return 0;
 }
 
-// Loescht alle Fehler und Warnungen eines Objekts (soweit per modus
-// ausgewaehlt). Entscheidend ist der _Loadname_!
-private int DeleteErrorsForLoadname(string loadname, string note)
-{
-  int sum_deleted;
-  // Bei == 0 wird sonst alles geloescht. ;-)
-  if (!loadname)
-    return 0;
-
-  foreach(int m: ALL_ERR_TYPES)
-  {
-    if (!(m & modus))
-      continue;
-    < <int|string>* >* list = ({< <int|string>* >*})ERRORD->QueryIssueListByLoadname(loadname,m);
-    if (pointerp(list))
-    {
-      foreach(<int|string>* row : list)
-      {
-          if (({int})ERRORD->ToggleDeleteError(row[0], note) == 1)
-          {
-            tell_object(PL,
-                row[0] + " als geloescht markiert.\n");
-          }
-      }
-      sum_deleted+=sizeof(list);
-    }
-  }
-  return sum_deleted;
-}
-
 public int CmdFehlerLoeschen(string arg)
 {
   int issueid;
   string note;
+  struct fullissue_s|struct fullissue_s* issues;
   arg = ({string})this_player()->_unparsed_args(0);
 
   if (stringp(arg) && sizeof(arg))
   {
-      issueid = to_int(arg);
-      // Fuehrende Leerzeichen entfernen, um ID und Notiz zuverlaessig trennen zu
-      // koennen.
-      arg = trim(arg, TRIM_LEFT);
-      // Alles ab dem zweiten Wort sollte eine Notiz sein.
-      int spacepos = strstr(arg, " ");
-      if(spacepos != -1)
-      {
-        note = arg[spacepos + 1 ..];
-        arg = arg[.. spacepos - 1];
-      }
+    // Fuehrende Leerzeichen entfernen, um ID und Notiz zuverlaessig trennen zu
+    // koennen.
+    arg = trim(arg, TRIM_LEFT);
+    // Alles ab dem zweiten Wort sollte eine Notiz sein.
+    int spacepos = strstr(arg, " ");
+    if(spacepos != -1)
+    {
+      note = arg[spacepos + 1 ..];
+      arg = arg[.. spacepos - 1];
+    }
+    issues = get_issues(arg, 1);
+    if(structp(issues))
+    {
+      issueid = issues->id;
+    }
   }
   else
-      issueid = lfehler;
+    issueid = lfehler;
 
   notify_fail("Einen Eintrag mit dieser ID/diesem Loadname gibt es nicht!\n");
 
-  int res = ({int})ERRORD->ToggleDeleteError(issueid, note);
-  if (res == 1)
+  if(issueid > 0)
   {
-    tell_object(PL,
-      "Fehler/Warnung wurde zum Loeschen markiert und wird in Kuerze "
-      "geloescht.\n");
-    lfehler = issueid;
-    return 1;
+    int res = ({int})ERRORD->ToggleDeleteError(issueid, note);
+    if (res == 1)
+    {
+      tell_object(PL,
+        "Fehler/Warnung wurde zum Loeschen markiert und wird in Kuerze "
+        "geloescht.\n");
+      lfehler = issueid;
+      return 1;
+    }
+    else if (res==0)
+    {
+      tell_object(PL,"Loeschmarkierung wurde entfernt.\n");
+      lfehler = issueid;
+      return 1;
+    }
+    else if (res < -1)
+    {
+      tell_object(PL, "Irgendwas ist beim Loeschen schiefgegangen. "
+                      "Keine Schreibrechte?\n");
+      lfehler = issueid;
+      return 1;
+    }
   }
-  else if (res==0)
+  else if(pointerp(issues))
   {
-    tell_object(PL,"Loeschmarkierung wurde entfernt.\n");
-    lfehler = issueid;
-    return 1;
+    int sum_deleted = 0;
+    string res = "";
+    foreach(struct fullissue_s issue : issues)
+    {
+      issueid = issue->id;
+      if(({int})ERRORD->ToggleDeleteError(issueid, note) == 1)
+      {
+        res += issueid + " als geloescht markiert.\n";
+        ++sum_deleted;
+      }
+    }
+    PL->ReceiveMsg(res, MT_NOTIFICATION | MSG_DONT_WRAP);
+    return sum_deleted;
   }
-  else if (res < -1)
-  {
-    tell_object(PL, "Irgendwas ist beim Loeschen schiefgegangen. "
-                    "Keine Schreibrechte?\n");
-    lfehler = issueid;
-    return 1;
-  }
-  // res war == -1 -> Fehler nicht gefunden. Vielleicht ist es nen Loadname
-  return DeleteErrorsForLoadname(arg, note);
+  // Offenbar kein Fehler gefunden
+  return 0;
 }
 
 public int CmdRefresh(string arg) {
@@ -1135,9 +1129,12 @@
   return issue;
 }
 
-private struct fullissue_s|struct fullissue_s* get_issues(string arg)
+private struct fullissue_s|struct fullissue_s* get_issues(string arg, int parsed)
 {
-  arg=({string})PL->_unparsed_args();
+  // Manche Funktionen kuemmern sich selbst um _unparsed_args((), da z.B.
+  // noch eine Notiz abgeschnitten werden muss.
+  if(!parsed)
+    arg=({string})PL->_unparsed_args();
   struct fullissue_s|struct fullissue_s* issues;
 
   // Erstmal schauen, ob arg eine ID ist.