// MorgenGrauen MUDlib
//
// secure/master/autoinclude.c -- module of the master object: Autoincludes
//
// $Id: master.c 7041 2008-10-13 18:18:27Z Zesstra $

#define PRAGMA(x) "#pragma "x"\n"

#define RTTCHECKS PRAGMA("rtt_checks")
#define DEFAULTS PRAGMA("save_types,warn_unused_variables,\
    warn_applied_functions,warn_dead_code")

// geschachteltes Mapping in toplevel.region.magier Hierarchie.
// Wichtig: jede Hierarchiebene _muss_ ein Mapping sein, welches einen Eintrag
//          0 als Default enthaelt, welcher einen Strings als Wert hat.
//          Ausnahme: die letzte Ebene (Magierebene), die muss ein String ein.
private nosave mapping autoincludes = ([
    "d":      ([
                 "inseln": ([
                             0: "",
                             "zesstra": PRAGMA("strong_types") RTTCHECKS,
                            ]),
                 0: "",
               ]),
    "std":    ([
                 0: PRAGMA("strong_types") RTTCHECKS,
                 "lwo": ([
                            0: PRAGMA("lightweight"),
                        ]),
               ]),
    "items":    ([
                 0: PRAGMA("strong_types") RTTCHECKS,
               ]),
    "secure": ([
                 0: PRAGMA("strong_types,range_check") RTTCHECKS,
               ]),
    "obj":      ([
                 0: "",
                 "lwo": ([
                            0: PRAGMA("strong_types,lightweight") RTTCHECKS,
                        ]),
               ]),
    "p":      ([
                 0: "",
                 "daemon": ([
                                0: PRAGMA("strong_types") RTTCHECKS,
                            ]),
                 "service": ([
                                0: "",
                                "padreic": PRAGMA("strong_types") RTTCHECKS,
                            ]),
               ]),
    0: DEFAULTS,
]);

string autoincludehook(string base_file, string current_file, int sys_include)
{
  mapping topleveldir, region; // mappings for spezialisiertere Pfade
  string ainc_string;

  // Wenn current_file != 0 ist, wird gerade vom kompilierten Objekt
  // <base_file> etwas (indirekt) inkludiert. Dort duerfen die Pragmas
  // keinesfalls reingeschrieben werden.
  if (current_file)
    return 0;

  // Zuerst den global default holen.
  string res=autoincludes[0];

  // Fuer aeltere Files schalten wir einige Warnungen explizit aus. :-(
  // (1407179680 == "Mon,  4. Aug 2014, 21:14:40")
  // (1609455600 == "Fre,  1. Jan 2021, 00:00:00")
  // Auf anderen Rechnern als dem Mudrechner werden die Warnungen nur
  // eingeschaltet, wenn die Files seit dem Mudstart geaendert wurden.
  // Hintergrund: bei kopierten Mudlibs werden oft die mtimes geaendert und
  // dann scrollt auf einmal alles. Aber wenn man nach dem Mudstart was
  // aendert, ist es vermutlich ne einzelne, gezielte Aenderung an einem File.
#if MUDHOST == __HOST_NAME__
  switch(call_sefun("file_time", base_file))
  {
    case 0 .. 1407179680:
      res += PRAGMA("no_warn_missing_return");
      // Fall-through, die naechsten kommen auch dazu
    case 1407179681 .. 1609455600:
      res += PRAGMA("no_warn_unused_variables,no_warn_dead_code,\
                     no_warn_applied_functions");
      // Fall-through
  }
#else
  if (call_sefun("file_time", base_file) < __BOOT_TIME__)
  {
      res += PRAGMA("no_warn_missing_return,no_warn_unused_variables,\
                     no_warn_dead_code,no_warn_applied_functions");
  }
#endif

  // Aber schlussendlich werden jetzt noch Einstellungen fuer bestimmte,
  // gezielt konfigurierte Verzeichnisse ermittelt. (Diese ueberschreiben ggf.
  // auch die abgeschalteten Warnungen oben.)

  string *p_arr = explode(base_file,"/")-({""});
  //DEBUG(sprintf("AINC: File: %O, Pfad: %O\n",base_file, p_arr));

  if (sizeof(p_arr) && m_contains(&topleveldir, autoincludes, p_arr[0])) {
    // p_arr[0]: d, p, std, etc.
    // erst wird der Defaulteintrag 0 genommen
    res += topleveldir[0];
    if (sizeof(p_arr) > 1 && m_contains(&region, topleveldir, p_arr[1])) {
      // p_arr[1] ebene, polar, unterwelt, service, ...
      // erst den Defaulteintrag der Region nehmen
      res += region[0];
      if (sizeof(p_arr) > 2 && m_contains(&ainc_string, region, p_arr[2])) {
        // p_arr[2]: magiername. Fuer den Magier was hinterlegt.
        res += ainc_string;
      }
    }
  }
  //DEBUG(res);
  return res;
}
#undef RTTCHECKS
#undef DEFAULTS
#undef PRAGMA


