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;
+}