diff --git a/lib/master.pike.in b/lib/master.pike.in
index 7ea5a4d9ba17b0105173b05187c69769a0551745..63e5ecc7651c3132fab33fbb4948c3d1909e78f3 100644
--- a/lib/master.pike.in
+++ b/lib/master.pike.in
@@ -1,4 +1,4 @@
-/* $Id: master.pike.in,v 1.38 1999/02/04 23:45:12 mast Exp $
+/* $Id: master.pike.in,v 1.39 1999/02/26 01:08:52 grubba Exp $
  * 
  * Master-file for Pike.
  *
@@ -473,6 +473,11 @@ class dirnode
   int _cache_full;
   void fill_cache()
   {
+#ifdef RESOLV_DEBUG
+    werror(describe_backtrace(({ sprintf("Filling cache in dirnode %O\n",
+					 dirname),
+				 backtrace() })));
+#endif /* RESOLV_DEBUG */
     if (_cache_full) {
       return;
     }
@@ -569,6 +574,10 @@ class joinnode
   int _cache_full;
   void fill_cache()
   {
+#ifdef RESOLV_DEBUG
+    werror(describe_backtrace(({ "Filling cache in joinnode\n",
+				 backtrace() })));
+#endif /* RESOLV_DEBUG */
     if (_cache_full) {
       return;
     }
@@ -957,6 +966,38 @@ void compile_warning(string file,int line,string err)
 }
 
 
+static mixed _charset_mod;
+/* This function is called by cpp() when it wants to do
+ * character code conversion.
+ */
+string decode_charset(string data, string charset)
+{
+  werror(sprintf("decode_charset(%O, %O)\n", data, charset));
+
+  if (!_charset_mod) {
+    mixed mod = resolv("Locale");
+
+    _charset_mod = mod && mod["Charset"];
+    if (!_charset_mod) {
+      compile_warning("-", 0, "No Locale.Charset module!");
+      return 0;
+    }
+  }
+
+  object decoder;
+
+  catch {
+    decoder = _charset_mod->decoder(charset);
+  };
+
+  if (!decoder) {
+    compile_warning("-", 0, sprintf("Unknown charset %O!", charset));
+    return 0;
+  }
+  return decoder->feed(data)->drain();
+}
+
+
 /* This function is called whenever an #include directive is encountered
  * it receives the argument for #include and should return the file name
  * of the file to include