Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/p/daemon/mand.c b/p/daemon/mand.c
new file mode 100644
index 0000000..e80c50e
--- /dev/null
+++ b/p/daemon/mand.c
@@ -0,0 +1,169 @@
+//
+// mand.c - Manpage Daemon
+//
+// Erweitert und umgearbeitet fuer die Anbindung durch
+// die Magiershell
+//
+// von Mandragon@MG
+//
+// Basiert auf der Arbeit von Hadra,Mupfel und Tyron
+// (alle @Anderland)
+//
+
+#define DEBUGGER "mandragon"
+
+#define DEBUG(x) if (find_player(DEBUGGER)) \
+                         tell_object(find_player(DEBUGGER),x+"\n")
+
+
+#pragma strict_types,save_types
+#pragma no_clone,no_shadow
+
+#include <daemon/mand.h>
+
+private nosave mapping pages;
+private nosave string *keys;
+private nosave mapping pages_case;
+private nosave string *keys_case;
+
+static string glob2regexp(string str)
+{
+  str=regreplace(str,"([\\.\\^\\$\\[\\]\\(\\)])","\\\\\\1",1);
+  str=regreplace(str,"\\*",".*",1);
+  return regreplace("^"+str+"$","?",".",1);
+}
+
+void cache_entry(string entry, string dir, string file)
+{
+  string *data;
+  int j;
+
+  if (m_contains(&data,pages,lower_case(entry)))
+  {
+    j=sizeof(data);
+    while(j--) data[--j]=data[j];
+    pages[lower_case(entry)]=data+({ dir+"/"+file, dir+"/"+file});
+  }
+  else
+  {
+    pages[lower_case(entry)]=({entry,dir+"/"+file});
+    keys+=({lower_case(entry)});
+  }
+  if (m_contains(&data,pages_case,entry))
+  {
+    j=sizeof(data);
+    while(j--) data[--j]=data[j];
+    pages_case[entry]=data+({ dir+"/"+file, dir+"/"+file});
+  }
+  else
+  {
+    pages_case[entry]=({entry,dir+"/"+file});
+    keys_case+=({entry});
+  }
+  return;
+}
+
+static void load_synonyms(string dir)
+{
+  string filedata,*syn;
+
+  if (file_size(MAND_DOCDIR+dir+"/.synonym")<=0) return;
+  if (!(filedata=read_file(MAND_DOCDIR+dir+"/.synonym"))) return;
+  syn=regexplode(filedata, "([ \t][ \t]*|\n)")-({""});
+  syn-=regexp(syn,"^([ \t][ \t]*|\n)$");
+  while(sizeof(syn))
+  {
+    cache_entry(syn[0],dir,syn[1]);
+    syn=syn[2..];
+  }
+  return;
+}
+
+static void cache_directory(string dir)
+{
+  string file;
+  int i,j;
+  mixed *files;
+
+  files = get_dir(MAND_DOCDIR+dir+"/*",3)||({});
+  i=sizeof(files);
+  for (j=0;j<i;)
+  {
+    file=files[j++];
+    if (file[0]=='.')
+    {
+      j++;
+      continue;
+    }
+    if (files[j++]==-2)
+    {
+      cache_directory(dir+"/"+file);
+      continue;
+    }
+    cache_entry(file,dir,file);
+  }
+  load_synonyms(dir);
+}
+
+void update_cache()
+{
+  int i;
+  string *docdirs;
+  mixed *tmp;
+
+  tmp=get_dir(MAND_DOCDIR "*",3);
+  docdirs=({});
+  pages=([]);
+  pages_case=([]);
+  keys_case=({});
+  keys=({});
+  i=sizeof(tmp);
+  while(i--)
+    if (tmp[i]==-2)
+      docdirs+=({ tmp[(i--)-1] });
+  docdirs-=({".",".."});
+  docdirs-=MAND_EXCLUDE;
+  i=sizeof(docdirs);
+  while(i--) cache_directory(docdirs[i]);
+  return;
+}
+
+void create()
+{
+  seteuid(getuid());
+  update_cache();
+  set_next_reset(10080); //Einmal pro Woche langt
+  return;
+}
+
+void reset()
+{
+  update_cache();
+  set_next_reset(10080);
+  return;
+}
+
+//
+// locate(): Manpage im Cache suchen:
+// match = 1 -> glob-matching, match=2 -> regexp-matching
+// Pruefung ob str gueltige regexp erfolgt in der Shell
+//
+
+string *locate(string str,int match)
+{
+  string *matches,*ret,str2;
+  int i;
+
+  if (!match&&member(keys_case,str)!=-1) return pages_case[str];
+  str=lower_case(str);
+  if (match==1) str=glob2regexp(str);
+  if (match) matches=regexp(keys,str);
+  else if (member(keys,str)!=-1) matches=({ str });
+  else return ({});
+
+  ret=({});
+  i=sizeof(matches);
+  while(i--)
+    ret+=pages[matches[i]];
+  return ret;
+}