Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/obj/tools/lisp/parser.c b/obj/tools/lisp/parser.c
new file mode 100644
index 0000000..dc47d65
--- /dev/null
+++ b/obj/tools/lisp/parser.c
@@ -0,0 +1,109 @@
+// PARSER.C -- parser for parenthesis expressions
+// (c) 1994 by Hate@MorgenGrauen, TUBmud, NightFall
+// --
+// Copy, change and distribute this bit of software as much as you like,
+// but keep the name of the original author in the header.
+
+#pragma strong_types
+
+#include "tweak.h" 
+
+private inherit HOME("lex");
+
+#include "stack.h"
+#include "types.h"
+
+private nosave mixed code;
+private nosave mixed stack;
+private nosave int quot, assume;
+
+nomask static void initialize()
+{
+  INITSTACK(stack);
+  code = ({});
+  quot = 0;
+}
+
+static void create()
+{
+  lex::create();
+  initialize();
+}
+
+nomask private mixed CodeGen(mixed token)
+{
+  switch(pre_parse(&code)) 
+  {
+  case 1: PUSH(stack, "'");          // standard autoquote
+	  quot++;
+	  break;
+  case 2: PUSH(stack, "'CODE");          // special QUOTE for code generation
+          break;	
+  }
+  if(stringp(token))
+    switch(token)
+    {
+      case "'": PUSH(stack, token); quot++; return;
+      case "(": PUSH(stack, code); code = ({}); break;
+      case ")":
+      {
+        mixed tmp;
+	if(SP(stack) && pointerp(TOP(stack))) POP(stack, tmp);
+        else tmp = ({});
+        if(SP(stack) && TOP(stack) == "'")
+	  /* do nothing */ ;
+        else
+          if(sizeof(code))
+	  {
+	    code[0] = prog_parse(code[0]);
+	    if(CL_LAMBDA(code[0]) || symbolp(code[0]) || pointerp(code[0]))
+	      code = ({#'funcall}) + code;
+	  }
+        code = tmp + ({ code });
+        break;
+      }
+      default : code += ({ token[1..<2] }); break;
+    }
+  else
+    code += ({ quot ? token : prog_parse(token, !sizeof(code)) });
+
+  while(SP(stack) && (TOP(stack) == "'"  || TOP(stack) == "'CODE") && 
+        sizeof(code)) 
+  { 
+    int q;
+    if(stringp(code[<1]) || symbolp(code[<1]) || pointerp(code[<1]) || 
+       get_type_info(code[<1])[0] == 10) // quoted array
+        code[<1] = quote(code[<1]); 
+    POPX(stack); 
+  }
+}
+
+// parse() -- non-threaded parsing (continue on input)
+nomask static int parse(mixed msg, int interactive)
+{
+  mixed token, res;
+  int lexing, missing_par;
+  do {
+    if(lexing = lex(&token))	
+    {					// try to assume outer "("
+      if(!SP(stack) && token != "(") { CodeGen("("); assume = 1; }
+      CodeGen(token);
+    }
+    else 				// add ")" if "(" is assumed
+      if(sizeof(stack) == 1 && assume) { CodeGen(")"); assume = 0; lexing = 1; }
+    if(lexing && !SP(stack))		// complete expression found
+    {
+      mixed exec_code; exec_code = code; initialize();
+      if(sizeof(exec_code) && pointerp(exec_code[0])) 
+        exec_code = ({#',}) + exec_code;// more than one expr on one line
+      if(msg = catch(res = eval(exec_code))) 
+        return -2;			// execution error
+      if(interactive) printf(output(res));
+      else msg = res;
+    }
+  }
+  while(lexing);
+  if(missing_par = SP(stack)) 
+    return (msg = sprintf("*Missing %d )\n", missing_par), -3); 
+  return 0;
+}