Expansion von Platzhaltern aus master verlegt

Die Funktionalitaet wird nun ganz aus dem Mastercode entfernt
und zieht um nach /std/util/path, von wo es geerbt werden kann.
Dort findet sich nun auch normalize_path().
Der Code im Master beschraenkt sich vollstaendig darauf,
Pfade "sane" zu machen.

Change-Id: I7a38366466aa206f858be9ff1d5fb9573504ce43
diff --git a/secure/master.c b/secure/master.c
index 306f0a7..b4b79d1 100644
--- a/secure/master.c
+++ b/secure/master.c
@@ -431,9 +431,9 @@
   // path_array nach strs
   // TODO: was ist mit clones?
   if(objectp(str))
-    strs=path_array(object_name(str), 0, 0);
+    strs=path_array(object_name(str));
   else if(stringp(str))
-    strs=path_array(str, 0, 0);
+    strs=path_array(str);
   else return NOBODY;
 
   // absolute Pfade interessieren hier gerade nicht.
diff --git a/secure/master.h b/secure/master.h
index f97b0d0..51f579b 100644
--- a/secure/master.h
+++ b/secure/master.h
@@ -26,7 +26,6 @@
 #include "/secure/config.h"
 
 #include "/sys/userinfo.h"
-#include "/sys/shells.h"
 #include "/sys/player/base.h"
 #include "/sys/moving.h"
 #include "/sys/defines.h"
diff --git a/secure/master/file_access.c b/secure/master/file_access.c
index 93738ab..8b1bbd5 100644
--- a/secure/master/file_access.c
+++ b/secure/master/file_access.c
@@ -24,48 +24,11 @@
 // Normalisiert den Pfad und liefert ein Array mit Pfadelementen.
 // expand bestimmt, ob im Pfad +, ~ oder P_CURRENTDIR expandiert werden oder
 // nicht.
-string *path_array(string path, string user, int expand) {
-  string cwd;
+string *path_array(string path) {
 
   if (!sizeof(path))
     return ({"",""}); // additional "" to yield "/" later.
 
-  // expand gibt es nur wenn angefordert
-  if (expand)
-  {
-    switch(path[0])
-    {
-      // expand nur fuer nicht-absolute Pfade
-      case '/':
-        break;
-      case '+':
-        if(sizeof(path)==1)
-          return ({"",DOMAINDIR});
-        path="/"DOMAINDIR"/" + path[1..];
-        break;
-      case '~':
-        if (sizeof(path)==1)
-        {
-          if(user)
-            return ({"",WIZARDDIR,user});
-          else
-            return ({"",WIZARDDIR});
-        }
-        else
-        {
-          if(user && sizeof(path)>1 && path[1]=='/') // "~/"
-            path="/"WIZARDDIR"/" + user + "/" + path[2..];
-          else
-            path="/"WIZARDDIR"/" + path[1..];
-        }
-        break;
-      default:
-        if(user && TP && getuid(TP) == user
-            && (cwd=(string)TP->QueryProp(P_CURRENTDIR)))
-          path=cwd + "/" + path;
-    }
-  }
-
   // remove multiple '/'erstn gv
   path = regreplace(path, "/+", "/", 1);
 
@@ -109,23 +72,13 @@
 // Pfadnormalisierung OHNE Ersetzungen von +, ~ und P_CURRENTDIR (war mal mit)
 // Eigentlich hier ziemlich unnuetz, aber nen Haufen Objekte im Mud ruft das.
 string _get_path(string path, string user) {
-  return implode(path_array(path, user, 0),"/");
-}
-
-// Besser benamste Version von _get_path().
-// Normalisiert den Pfad, expandiert Platzhalter auf Wunsch, benutzt ggf. TI
-// oder TP als User, wenn nicht angegeben.
-varargs string normalize_path(string path, string user, int expand) {
-  if (!user && (TI || TP))
-    user = getuid(TI || TP);
-  return implode(path_array(path, user, expand), "/");
+  return implode(path_array(path),"/");
 }
 
 // Diese Funktion wird vom Driver nur fuer den Editor ed gerufen, aber der
-// Rest vom MG ruft es teilweise auch. Hier erfolgt eine Expansion von
-// Platzhaltern im Pfad.
+// Rest vom MG ruft es teilweise auch.
 string make_path_absolute(string path) {
-  return normalize_path(path, getuid(TI || TP), 1);
+  return implode(path_array(path),"/");
 }
 
 static int project_access(string user, string project)
@@ -222,23 +175,23 @@
 
   switch(fun) {
     case "log_file":
-      strs=path_array("/"+path, 0, 0);
+      strs=path_array("/"+path);
       path = implode(strs, "/");
       strs -= ({""}); // remove trailing and leading "/".
       if (sizeof(strs)>1 && strs[0]=="log") return path;
       return 0;
     case "save_object":
       if (!sizeof(path)) return 0;
-      strs=path_array("/"+path, 0, 0);
+      strs=path_array("/"+path);
       break;
     case "ed_start":
       if (sizeof(path))
-        strs=path_array(path, euid, 1);
+        strs=path_array(path);
       else
         strs=({"players",euid,".err"});
       break;
     default:
-      strs=path_array(path, euid, 0);
+      strs=path_array(path);
   }
 
   if (!euid || euid=="NOBODY" || euid=="ftp" || euid=="anonymous") return 0;
@@ -439,7 +392,7 @@
 
   if (!euid) euid="-";
 
-  strs=path_array(path, euid, 0);
+  strs=path_array(path);
   // Pfade sind ab jetzt auf jeden Fall absolut.
   path=implode(strs, "/");
 
diff --git a/std/util/path.c b/std/util/path.c
new file mode 100644
index 0000000..3ae07b8
--- /dev/null
+++ b/std/util/path.c
@@ -0,0 +1,59 @@
+#pragma strict_types, rtt_checks, pedantic, range_check, no_clone
+
+#include <config.h>
+#include <shells.h>
+#include <defines.h>
+
+// Ersetzt Platzhalter im Pfad und versorgt relative Pfade mit P_CURRENTDIR
+// Funktionalitaet war mal im master() in der Rechtepruefung, gehoert da aber
+// wirklich nicht hin.
+string expand_path(string path, string user)
+{
+  string cwd;
+  if (!sizeof(path))
+    return path;
+  switch(path[0])
+  {
+    // expand nur fuer nicht-absolute Pfade
+    case '/':
+      break;
+    case '+':
+      if(sizeof(path)==1)
+        path="/"DOMAINDIR;
+      path="/"DOMAINDIR"/" + path[1..];
+      break;
+    case '~':
+      if (sizeof(path)==1)
+      {
+        if(user)
+          path="/"WIZARDDIR"/"+user;
+        else
+          path="/"WIZARDDIR;
+      }
+      else
+      {
+        if(user && sizeof(path)>1 && path[1]=='/') // "~/"
+          path="/"WIZARDDIR"/" + user + "/" + path[2..];
+        else
+          path="/"WIZARDDIR"/" + path[1..];
+      }
+      break;
+    default:
+      if(user && PL && getuid(PL) == user
+          && (cwd=(string)PL->QueryProp(P_CURRENTDIR)))
+        path=cwd + "/" + path;
+  }
+  return path;
+}
+
+// Besser benamste Version von _get_path() aus master().
+// Normalisiert den Pfad, expandiert Platzhalter auf Wunsch, benutzt ggf. RPL
+// oder PL als User, wenn nicht angegeben.
+varargs string normalize_path(string path, string user, int expand) {
+  if (!user && (RPL || PL))
+    user = getuid(RPL || PL);
+  if (expand)
+    path=expand_path(path, user);
+  return implode(master()->path_array(path), "/");
+}
+